gzipGNU/Linux平台下常用的压缩格式。gzipgunzipzcat都可以处理这种格式。但这些工具只能压缩/解压缩单个文件或数据流,无法直接归档目录和多个文件。好在gzip可以同tarcpio配合使用。

7.4.1 实战演练

gzipgunzip可以分别用于压缩与解压缩。

使用 gzip 压缩文件

  1. $ gzip filename
  2. $ ls
  3. filename.gz
  1. [root@dev workspace]# ls
  2. archive.tar.gz else if.sh out.html out.txt sample1.txt showArgs.sh tools variables.sh vitest.tar
  3. echo golang input.txt output.txt printf.sh sample2.txt temp.txt umq vitest welcome.txt
  4. [root@dev workspace]# gzip out.html
  5. [root@dev workspace]# ls
  6. archive.tar.gz else if.sh out.html.gz out.txt sample1.txt showArgs.sh tools variables.sh vitest.tar
  7. echo golang input.txt output.txt printf.sh sample2.txt temp.txt umq vitest welcome.txt
  8. [root@dev workspace]#

image.png

解压缩 gzip 文件

  1. $ gunzip filename.gz
  2. $ ls
  3. filename

列出压缩文件的属性信息

  1. $ gzip -l test.txt.gz
  2. compressed uncompressed ratio uncompressed_name
  3. 35 6 -33.3% test.txt
  1. [root@dev workspace]# gzip out.html
  2. [root@dev workspace]# ls
  3. archive.tar.gz else if.sh out.html.gz out.txt sample1.txt showArgs.sh tools variables.sh vitest.tar
  4. echo golang input.txt output.txt printf.sh sample2.txt temp.txt umq vitest welcome.txt
  5. [root@dev workspace]# gzip -l out.html.gz
  6. compressed uncompressed ratio uncompressed_name
  7. 64101 1024100 93.7% out.html
  8. [root@dev workspace]#

gzip 命令可以从 stdin 中读入文件并将压缩文件写出到 stdout

stdin读入并将压缩后的数据写出到stdout

  1. $ cat file | gzip -c > file.gz

选项-c用来将输出指定到stdout。该选项也可以与cpio配合使用:

  1. $ ls * | cpio -o | gzip -c > cpiooutput.gz
  2. $ zcat cpiooutput.gz | cpio -it

设置 gzip 的压缩率

我们可以指定gzip的压缩级别。--fast--best选项分别提供最低或最高的压缩率。

7.4.2 补充内容

gzip命令通常与其他命令结合使用,另外还有一些高级选项可以用来指定压缩率。

压缩归档文件

后缀.gz表示的是经过gzip压缩过的tar归档文件。有两种方法可以创建此类文件。

  • 第一种方法

    1. $ tar -czvvf archive.tar.gz [FILES]

    或者

    1. $ tar -cavvf archive.tar.gz [FILES]

    选项-z指明用gzip进行压缩,选项-a指明根据文件扩展名推断压缩格式。
    image.png

  • 第二种方法

首先,创建一个tar归档文件:

  1. $ tar -cvvf archive.tar [FILES]

压缩tar归档文件:

  1. $ gzip archive.tar

如果有大量文件(上百个)需要归档及压缩,我们可以采用第二种方法并稍作变动。将多个文件作为命令行参数传递给tar的问题在于后者能够接受的参数有限。要解决这个问题,我们可以在循环中使用追加选项(-r)来逐个添加文件:

  1. FILE_LIST="file1 file2 file3 file4 file5"
  2. for f in $FILE_LIST;
  3. do
  4. tar -rvf archive.tar $f
  5. done
  6. gzip archive.tar

下面的命令可以提取经由gzip压缩的归档文件中的内容:

  1. $ tar -xavvf archive.tar.gz -C extract_directory

其中,选项-a用于自动检测压缩格式。

zcat —— 直接读取 gzip 格式文件

zcat命令无需经过解压缩操作就可以将.gz文件的内容输出到stdout.gz文件不会发生任何变化。

  1. $ ls
  2. test.gz
  3. $ zcat test.gz
  4. A test file
  5. #文件test中包含了一行文本"A test file"
  6. $ ls
  7. test.gz

压缩率

我们可以指定压缩率,它共有 9 级,其中:

  • 1 级的压缩率最低,但是压缩速度最快;
  • 9 级的压缩率最高,但是压缩速度最慢。

你可以按照下面的方法指定压缩比:

  1. $ gzip -5 test.img

gzip 默认使用第 6 级,倾向于在牺牲一些压缩速度的情况下获得比较好的压缩率。

使用 bzip2

bzip2在功能和语法上与gzip类似。不同之处在于bzip2的压缩效率比gzip更高,但花费的
时间比gzip更长。

bzip2进行压缩:

  1. $ bzip2 filename

解压缩bzip2格式的文件:

  1. $ bunzip2 filename.bz2

生成tar.bz2文件并从中提取内容的方法同之前介绍的tar.gz类似:

  1. $ tar -xjvf archive.tar.bz2

其中,-j表明该归档文件是以bzip2格式压缩的。

使用 lzma

lzma的压缩率要优于gzipbzip2

使用lzma进行压缩:

  1. $ lzma filename

解压缩lzma文件:

  1. $ unlzma filename.lzma

可以使用--lzma选项压缩生成的tar归档文件:

  1. $ tar -cvvf --lzma archive.tar.lzma [FILES]

或者

  1. $ tar -cavvf archive.tar.lzma [FILES]

lzma压缩的tar归档文件中的内容提取到指定的目录中:

  1. $ tar -xvvf --lzma archive.tar.lzma -C extract_directory

其中,-x用于提取内容,--lzma指定使用lzma解压缩归档文件。

我们也可以用:

  1. $ tar -xavvf archive.tar.lzma -C extract_directory

7.4.3 参考

7.2 节讲解了 ta r命令。