我确实认为以下命令是等效的,但它们产生不同的校验和:
tar -cvzf ...
并且tar -cvf ...; gzip ...
不会产生相同的输出。
sha1sum
不同。
什么gzip
命令可以与行为完美匹配tar -cvzf
?
答案1
输出文件的差异可能不是由于压缩方法造成的。默认情况下,GNU tar 使用标准 GZIP放气模式。造成这种差异的原因之一是 GZIP 压缩文件的格式。
GZIP 头前 8 个字节的结构如下
OFFSET SIZE VALUE COMMENT
0 1 0x1F First "magic" id
1 1 0x8B Second "magic" id
2 1 CM Compression method
3 1 FLAGS 8-bit flag register
4 4 MTIME Object modification time
问题出在MTIME
字段上。对于来自管道的数据,这是当前 Unix 时间的值(自 1970 年 1 月 1 日以来的秒数)。因此,两个彼此之间至少相隔一秒创建的完全相同的压缩档案将有所不同。
尝试tar -cvzf
对同一数据运行两次并比较结果。结果将在第 5 个字节(时间戳值的最低字节)上有所不同。
$ tar czvf test1.tgz tmp/ ; sleep 2 ; \
tar czvf test2.tgz tmp/ ; md5sum test1.tgz test2.tgz
tmp/
tmp/test
tmp/
tmp/test
23d46f62dd4a9a0851279df7fe15842e test1.tgz
c8ae65026a5f771c63acf87a18f7379c test2.tgz