「gzip(1)」-

压缩或扩展文件

命令语法格式

gzip [ -acdfhklLnNrtvV19 ] [–rsyncable] [-S suffix] [ name … ]

gunzip [ -acfhklLnNrtvV ] [-S suffix] [ name … ]

zcat [ -fhLV ] [ name … ]

命令描述

命令gzip使用Lempel-Ziv编码(LZ77)减小了命名文件的大小。只要有可能,每个文件都替换为扩展名为.gz的文件,同时保留原有的所有权模式、访问时间、修改时间。(对于VMS,默认扩展名为-gz;对于MSDOS,OS/2 FAT,Windows NT FAT和Atari,默认扩展名为z)如果未指定文件,或者文件名为“-”,则将对标准输入压缩,然后写入标准输出。命令gzip只会尝试压缩常规文件。特别是,它将忽略符号链接。

如果压缩文件名对于其文件系统来说太长,gzip会截断它。Gzip尝试仅截断文件名中超过3个字符的“部分”(“部分”由点分隔。)。如果名称仅由小部分组成,则最长的部分将被截断。例如,如果文件名限制为14个字符,则gzip.msdos.exe将压缩为gzi.msd.exe.gz。在没有文件名长度限制的系统上,名称不会被截断。

默认情况下,gzip将原始文件名和时间戳保留在压缩文件中。使用-N选项解压缩文件时使用这些。当压缩文件名被截断或文件传输后未保留时间戳时,这很有用。

可以使用gzip -d或gunzip或zcat将压缩文件恢复为原始格式。如果保存在压缩文件中的原始名称不适合其文件系统,则会从原始名称构造一个新名称以使其合法。

gunzip在其命令行中获取文件列表,并替换名称以.gz,-gz,.z,-z,_z(忽略大小写)结尾的每个文件,并以没有原始扩展名的未压缩文件的正确幻数开头。gunzip还将特殊扩展名.tgz和.taz分别识别为.tar.gz和.tar.Z的缩写。压缩时,gzip会在必要时使用.tgz扩展名,而不是截断扩展名为.tar的文件。

gunzip目前可以解压缩由gzip,zip,compress,compress -H,pack创建的文件。输入格式的检测是自动的。使用前两种格式时,gunzip会检查32位CRC。对于pack和gunzip进行检查未压缩的长度。标准压缩格式的设计不允许进行一致性检查。然而,gunzip有时能够检测到错误的.Z文件。如果在解压缩.Z文件时出错,请不要认为.Z文件是正确的,因为标准的uncompress不会警告错误。这通常意味着标准的uncompress不检查其输入,并直接生成垃圾输出。SCO compress -H格式(lzh压缩方法)不包括CRC,但也允许一些一致性检查。

zip创建的文件只有在使用’deflation’方法压缩的单个成员时才能通过gzip解压缩。此功能仅用于帮助将tar.zip文件转换为tar.gz格式。要使用单个成员提取zip文件,请使用gunzip < foo.zipgunzip -S .zip foo.zip之类的命令。要提取包含多个成员的zip文件,请使用unzip而不是gunzip。

zcat与gunzip -c完全相同。(在某些系统上,zcat可以作为gzcat安装,以保留原始链接以进行压缩。)zcat解压命令行上的文件列表或其标准输入,并将未压缩的数据写入标准输出中。zcat将解压缩具有正确幻数的文件,无论它们是否具有.gz后缀。

Gzip使用zip和PKZIP中使用的Lempel-Ziv算法。获得的压缩量取决于输入的大小和公共子串的分布。通常,源代码或英语等文本减少了60-70%。压缩通常比LZW(在compress中使用),霍夫曼编码(在pack中使用)或自适应霍夫曼编码(在compact中使用)所实现的压缩要好得多。

即使压缩文件略大于原始文件,也始终执行压缩。最坏情况扩展是gzip文件头的几个字节,每32K块加5个字节,或大文件的扩展率为0.015%。请注意,实际使用的磁盘块数几乎不会增加。gzip在压缩或解压缩时保留文件的模式、所有权、时间戳。

命令支持的选项及含义

-a –ascii
ASCII文本模式:使用本地约定转换行尾。仅在某些非Unix系统上支持此选项。对于MSDOS系统,CR LF在压缩时转换为LF,而LF在解压缩时转换为CR LF。

-c –stdout –to-stdout
在标准输出上写入输出;保持原始文件不变。如果有多个输入文件,则输出是由一系列独立压缩的成员组成。要获得更好的压缩,请在压缩之前连接所有输入文件。

-d –decompress –uncompress
解压。

-f –force
即使文件有多个链接或相应的文件已存在,或者压缩数据是从终端读取或写入终端,也强制压缩或解压缩。如果输入数据不是gzip识别的格式,并且还给出了选项–stdout选项,则复制输入数据不做更改,并写入标准输出:让zcat表现为cat。

如果没有给出-f,并且当没有在后台运行时,gzip会提示是否应该覆盖现有文件。

-k –keep
在压缩或解压期间保留输入文件(不删除)。

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

  • compressed size: 压缩文件的大小
  • uncompressed size: 被解压的文件的大小
  • ratio: 压缩率(未知则显示“0.0%”)
  • uncompressed_name: 解压文件名

对于非gzip格式的文件,uncompressed size的大小为-1,例如压缩的.Z文件。要获得此类文件的未压缩大小,您可以使用zcat file.Z | wc -c命令。

结合–verbose选项,还会显示以下字段:

  • method: 压缩方法
  • crc: 解压数据的32位CRC
  • date & time: 被解压的文件的时间按戳

目前支持的压缩方法是deflate,compress,lzh(SCO compress -H)和pack。对于不是gzip格式的文件,crc以ffffffff的形式给出。

使用–name选项时,uncompressed_name、date & time是存储在压缩文件中的那些(如果存在)。

使用–verbose选项时,还会显示所有文件的总计大小和压缩比,除非某些大小未知。使用–quiet,不显示标题和总计行。

-n –no-name
压缩时使用该选项,默认情况下不保存原始文件名和时间戳。(如果必须截断名称,则始终保存原始名称。)

解压时使用该选项,即使存在,也不恢复原始文件名(仅从压缩文件名中删除gzip后缀);如果存在,也不恢复原始时间戳 (从压缩文件中复制它)。解压缩时,此选项是默认选项。

-N –name
压缩时使用该选项,始终保存原始文件名和时间戳; 这是默认值。

解压时使用该选项,恢复原始文件名和时间戳(如果存在)。在对文件名长度有限制的系统,又或在文件传输后丢失时间戳的系统上,此选项很有用。

-r –recursive
递归地传播目录结构。如果在命令行中指定的任何文件名是目录,gzip将下降到目录并压缩它在那里找到的所有文件。(或者在使用gunzip的情况下解压缩它们)。

–rsyncable
压缩时,根据输入偶尔同步输出。在大多数情况下,这会使大小增加不到1%,但这意味着当同步使用此标志压缩的两个文件时,rsync(1)程序可以利用未压缩输入中的相似性。gunzip无法区分使用此选项和不使用此选项创建的压缩文件之间的区别。

-S .suf –suffix .suf
压缩时,使用后缀“.suf”,而不是默认的“.gz”。可以给出任何非空后缀,但应避免使用除“.z”和“.gz”之外的后缀,以避免在将文件传输到其他系统时出现混淆。

解压缩时,在从输入文件名派生输出文件名时,将.suf添加到后缀列表的开头以进行尝试。

-# –fast –best
使用指定的数字“#”调节压缩速度,其中-1或–fast表示最快的压缩方法(压缩程度较低),-9或–best表示最慢的压缩方法(最佳压缩)。默认压缩级别为-6(即,以速度为代价偏向高压缩)。

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

-v –verbose
输出详细信息。显示压缩或解压的每个文件的名称和百分比缩减。

-q –quiet
抑制所有的警告。

其他选项

-V –version
显示版本信息和编译选项并退出。

-h –help
显示帮助信息并退出。

-L –license
显示gzip许可证并退出。

注意事项

将压缩数据写入磁带时,通常需要用零填充输出直到块边界。当读取数据,并将整个块传递给gunzip进行解压缩时,在压缩数据后,gunzip会检测到有额外的尾随垃圾数据,并发出警告(默认),您必须使用–quiet选项来禁止警告。可以在GZIP环境变量中设置此选项,如下所示:

  • for sh: GZIP=”-q” tar -xfz –block-compress /dev/rst0
  • for csh: (setenv GZIP -q; tar -xfz –block-compr /dev/rst0

在上面的例子中,gzip由GNU的tar的-z选项隐式调用。确保使用相同的块大小(tar的-b选项)来读取和写入磁带上的压缩数据。(此示例假定您使用的是GNU版本的tar。)

gzip格式表示模2^32的输入大小,因此–list选项报告的4GB+的未压缩文件的未压缩大小和压缩比是不正确的。若要解决此问题,您可以使用以下命令来发现大型未压缩文件的真实大小:

# zcat file.gz | wc -c

如果压缩文件位于不可搜索的媒体上,则–list选项将大小报告为“-1”,将crc报告为“ffffffff”。

在极少数情况下,选项–best会提供比默认压缩级别(-6)更差的压缩。在一些高度冗余的文件上,compress压缩比gzip更好。

问题诊断

Usage: gzip [-cdfhklLnNrtvV19] [-S suffix] [file …]
命令行中的选项无效。

file: not in gzip format
指定给gunzip的文件未压缩。

file: Corrupt input. Use zcat to recover some data.
压缩文件已经损坏。在失败点的数据可以使用zcat file > recover进行恢复。

file: compressed with xx bits, can only handle yy bits
文件被一个程序压缩(使用LZW),该程序可以处理比本机上的解压代码更多的位。使用gzip重新压缩文件,gzip可以更好地压缩并使用更少的内存。

file: already has .gz suffix — no change
假定该文件已被压缩。重命名该文件,然后重试。

file already exists; do you wish to overwrite (y or n)?
如果要替换输出文件,则回答“y”; 如果不是,“n”。

gunzip: corrupt input
检测到SIGSEGV违规,这通常意味着输入文件已损坏。

xx.x% Percentage of the input saved by compression.
(仅与-v和-l相关。)

— not a regular file or directory: ignored
当输入文件不是常规文件或目录(例如符号链接,套接字,FIFO,设备文件)时,它保持不变。

— has xx other links: unchanged
输入文件有链接;它保持不变。有关更多信息,请参阅ln(1)。使用-f标志强制压缩多重链接文件。

相关环境变量

GZIP
可以为gzip保存一组默认选项。首先解释该环境变量指定的这些选项,并且可以通过显式命令行参数覆盖这些选项。例如:

  • for sh: GZIP=”-8v –name”; export GZIP
  • for csh: setenv GZIP “-8v –name”
  • for MSDOS: set GZIP=-8v –name

在Vax/VMS上,环境变量的名称是GZIP_OPT,以避免与用于调用程序的符号集冲突。

退出状态

0 成功

1 发生错误

2 产生警告

简单示例

可以连接多个压缩文件。在这种情况下,gunzip将立即提取所有成员。例如:

# gzip -c file1 > foo.gz

# gzip -c file2 >> foo.gz

然后执行

# gunzip -c foo

等价于

# cat file1 file2

如果.gz文件的一个成员受损,其他成员仍然可以恢复(如果删除了损坏的成员)。但是,您可以通过一次压缩所有成员来获得更好的压缩:

# cat file1 file2 | gzip > foo.gz

上面的压缩好于

# gzip -c file1 file2 > foo.gz

如果要重新压缩连接文件以获得更好的压缩,请执行以下操作:

# gzip -cd old.gz | gzip > new.gz

如果压缩文件由多个成员组成,则–list选项报告的未压缩大小和CRC则仅适用于最后一个成员。如果您需要所有成员的未压缩大小,您可以使用:

# gzip -cd file.gz | wc -c

如果您希望创建一个包含多个成员的归档文件,以便以后可以独立提取成员,请使用tar或zip等归档文件。GNU的tar支持-z选项以透明方式调用gzip。gzip被设计为tar的补充,而不是替代品。

相关手册

znew(1), zcmp(1), zmore(1), zforce(1), gzexe(1), zip(1), unzip(1), compress(1)

GZIP file format specification version 4.3: http://www.ietf.org/rfc/rfc1952.txt

DEFLATE Compressed Data Format Specification version 1.3: http://www.ietf.org/rfc/rfc1951.txt

参考文献

  • man 1 gzip, Version 1.6-5+b1

更新日志

  • 08/13/2018 创建文章