@derobert的答案很好,尽管我想分享发现的其他信息。
gzip -l -v
gzip压缩的文件已经包含一个哈希(尽管不安全,请参见此SO post):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
可以将CRC和未压缩的大小结合起来以快速获得指纹:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
要检查两个字节是否相等,请使用cmp file1 file2
。现在,已压缩的文件具有一些标头,并附加了数据和页脚(CRC加原始大小)。所述的gzip格式描述示出了报头包含当文件被压缩和该文件名是在10个字节的报头之后附加了空终止字符串的时间。
因此,假设文件名是恒定的并且使用了相同的命令(gzip "$name"
),则可以通过使用cmp
和跳过包括时间的第一个字节来检查两个文件是否不同:
cmp -i 8 file1 file2
注意:假设相同的压缩选项很重要,否则该命令将始终将文件报告为不同。发生这种情况是因为压缩选项存储在标头中,并且可能会影响压缩数据。cmp
仅查看原始字节,而不将其解释为gzip。
如果文件名具有相同的长度,则可以尝试在读取文件名后计算要跳过的字节。如果文件名大小不同,则可以cmp
在跳过字节之后运行,例如cmp <(cut -b9- file1) <(cut -b10- file2)
。
zcmp
这绝对是最好的方法,它首先压缩数据,然后开始与比较字节cmp
(确实,这是在zcmp
(zdiff
)shellscript中完成的操作)。
一个注意事项,请不要害怕手册页中的以下注意事项:
如果在比较之前必须先解压缩两个文件,则将第二个文件解压缩到/ tmp。在所有其他情况下,zdiff和zcmp仅使用管道。
当您有足够新的Bash时,压缩将不会使用临时文件,而只会使用管道。或者,正如zdiff
消息人士所说:
# Reject Solaris 8's buggy /bin/bash 2.03.