gzip, gunzip, zcat

压缩或解压文件


语法格式

gzip [-acdflnNrtv123456789] [-S suffix] [files]
gunzip [-acfhlLnNrtvV] [-S suffix] [files]
zcat [-fhLV] [files]
gzip [-h|--help] [-L|--license] [-V|--version]

命令简介

gzip命令采用Lempel-Ziv算法(LZ77)压缩指定的文件,从而缩减文件的大小。只要可能,压缩后的每个文件均以原文件名加“.gz”后缀的文件名形式替换原先的文件,保留相同的文件属主、模式字段(包括访问权限),以及访问与修改时间等文件属性。

其中,files是一个或多个文件。如果未指定文件名参数,或指定的文件为“-”,则压缩来自标准输入的数据,然后把压缩结果写到标准输出。gzip通常仅尝试压缩普通文件,尤其是gzip会忽略符号链接文件。

如果压缩文件的名字太长,超出当前系统支持的长度,gzip将会尝试截短文件名至少含有3个以上字符的名字部分(通常是文件正名而非扩展名部分,以句点“.”为界)。如果文件名的每一部分都不超出3个字符,截掉最长的名字部分。例如,如果文件名的长度限制是14个字符,文件gzip.msdos.exe压缩后的文件名为gzi.msd.exe.gz。在没有文件名长度限制的系统中,通常不会出现文件名截短的情况。

通常,gzip将在压缩后的文件中保存原始文件名与时间属性,以便在使用“-N”选项解压文件时恢复文件的原状。当压缩后的文件出现文件名截短,或在文件传输时无法保持文件的时间属性时,保存上述信息是非常有用的。

使用“gzip -d”、gunzip或zcat命令,可以把压缩文件恢复到原状。如果压缩文件保存的原始文件名不适合当前的文件系统,采用截短原文件名的方式命名解压后的文件,以确保文件名的合法性。

gunzip依次解压命令行中指定的每个文件,然后使用解压后的原始文件替换每一个以“.gz”、“-gz”、“.z”、“-z”、“_z”或“.Z”为扩展名的压缩文件,删除文件的扩展名,以剩余部分重新命名解压后的文件。gunzip也能够识别与处理具有特殊扩展名“.tgz”和“.taz”(分别是“.tar.gz”与“.tar.Z”的缩写)的文件。在压缩“.tar”类型的文件时,必要时gzip可以使用“.tgz”作为扩展名以避免出现文件名截短的情况。

当前,gunzip能够解压gzip、zip、compress、“compress -H”或pack等命令创建的压缩文件,自动恢复输入文件的原始状态。

仅当zip压缩文件包含采用deflation算法压缩的单个文件成员时,gunzip才能解压zip命令创建的压缩文件。这一特性只是提供一种辅助手段,以便能够把tar.zip文件转换成tar.gz格式的文件。

若想解压一个具有单个文件成员的zip文件,可以使用诸如“gunzip <foo.zip”或“gunzip -S .zip foo.zip”之类的命令,若想解压具有多个成员文件的zip文件,应使用unzip命令而不是gunzip命令。

zcat等同于“gunzip -c”命令。zcat能够解压命令行中指定的一系列文件或来自标准输入的压缩数据,把解压后的结果数据写到标准输出。在解压与显示压缩文件时,zcat仅考虑文件是否具有正确的魔术号,而不管文件名后面是否具有“.gz”后缀。

gzip采用zip与PKZIP中也使用的Lempel-Ziv算法。压缩后的数据量取决于输入文件的大小与相同子串的分布。典型情况下,源代码或英文文本文件能够缩减60%~70%。其压缩效果通常好于LZW(compress中使用的压缩算法)、Huffman编码(pack中使用的压缩算法)或自适应Huffman编码等算法达到的压缩效果。

即使压缩文件略微大于原始文件,也总是执行压缩。在最糟糕的情况下,gzip文件最多增加少量字节的头信息,每增加一个32KB的数据块再加5个字节而已。对于大型文件,扩充率也就是0.015%。因此,压缩文件占用磁盘块的实际数量几乎不会增加。在压缩或解压文件时,gzip通常会维护文件的模式字段(包括访问权限)、文件属主和时间属性。

GZIP环境变量可用于设置gzip默认的选项。这些选项将会优先解释,也可以被命令行选项取消。例如:

GZIP="-8v --name"; export GZIP     (bash)
setenv GZIP "-8v --name"           (tcsh)

命令选项

-a, --ascii  ASCII文本模式。使用本地系统的惯例转换行终止符。只有部分非UNIX/Linux的系统支持这个选项。对于DOS/Windows系统,压缩文件时把回车换行字符转换成换行符。解压文件时把换行符转换成回车换行字符。

-c, --stdout --to-stdout  把输出数据写到标准输出。原始文件保持不变。如果存在若干个输入文件,输出数据由一系列独立的压缩成员组成。若想获得较好的压缩效果,最好在压缩之前把所有的输入文件衔接起来。

-d, --decompress, --uncompress  解压。

-f, --force  强制压缩或解压文件,即使文件具有多个链接,相应的文件已经存在,或者压缩数据读自或写到终端,也是如此。如果gzip无法识别输入数据的格式,而且同时指定了“--stdout”选项,把输入数据原封不动地复制到标准输出,就像zcat之于cat。如果未指定“-f”选项,而且也未在后台运行,gzip将提示请用户确认是否应覆盖现有的文件。

-l, --list  对于每一个压缩文件,列出下列字段:

compressed size:  压缩文件的大小。
uncompressed size:  未压缩之前文件的大小。“-1”表示指定的文件并非gzip格式,如“.Z”格式的压缩文件。此时可以利用“zcat file.Z | wc -c”命令,获知此类文件未压缩前的大小。
ratio:  压缩比(0.0%表示不知道压缩比)
uncompressed_name:  未压缩之前的文件名。
与“-v”选项一起使用时,还会列出下列字段:
method:  压缩算法。当前支持的压缩算法是deflate、compress、lzh与pack。
crc:  解压数据的32位CRC。ffffffff表示指定的文件并非gzip格式。
date & time:  未压缩之前文件的时间属性。
注意,与“-N”选项一起使用时,未压缩前的文件名字与时间属性存储在压缩文件中。与“-v”选项一起使用时,显示文件的大小与压缩比(除非不知道文件的大小)。与“-q”选项一起使用时,禁止显示标题行与汇总行。

-n, --no-name  压缩文件时,禁止保存原始的文件名与时间属性(默认)。但是,如果文件名不得不截短,则总是保存原始的文件名。解压文件时,禁止恢复原始的文件名(如果存在),只是简单地删除压缩文件名字的gzip后缀而已。此外,也禁止恢复原始的时间属性(如果存在),只是从压缩文件中直接复制过来。这个选项是解压文件时的默认选项。

-N, --name  压缩文件时,总是保存原始的文件名与时间属性。这是默认的做法。解压文件时,恢复原始的文件名与时间属性(如果存在)。仅当在具有文件名长度限制的系统上,或在文件传输过程中丢失时间属性时,这个选项才是有用的。

-q, --quiet  禁止输出任何警告信息。

-r, --recursive  递归地遍历目录结构。如果命令行中的任何文件名参数是目录,gzip将会深入目录,压缩或解压(调用gunzip时)其中的所有文件。

-S.suf,--suffix .suf  压缩文件时,使用指定的后缀“.suf”替代“.gz”。解压文件时,把“.suf”加到一系列后缀前面,以尝试匹配压缩文件。

-t, --test  测试。检测压缩文件的完整性。

-v, --verbose  详细显示方式。显示每个压缩或解压文件的名字与缩小或还原的百分比。

-#, --fast, --best  使用指定的数字“#”控制压缩速度。其中,“-1”或“--fast”表示最快的压缩算法(压缩效果较差),“-9”或“--best”表示最慢的压缩算法(压缩效果最好)。默认的压缩级别是“-6”。注意,在某些极特殊的情况下,“--best”选项的压缩效果可能比默认的压缩级别(“-6”选项)更糟。

应用实例

1. 压缩当前目录中的文件。

$ gzip nmap
$

2. 查询压缩文件的有关信息。

$ gzip -l nmap
         compressed        uncompressed  ratio uncompressed_name
               56772               162458  65.1% nmap
$

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z