所以,让我们创建两个相同的(空)文件。我们必须将它们放在不同的目录中,否则它们不能与相同的文件名共存:
$ touch a/1 b/1
(注意:不要在一个命令中执行$ md5sum a/1 b/1
d41d8cd98f00b204e9800998ecf8427e a/1
d41d8cd98f00b204e9800998ecf8427e b/1
,因为那时文件创建时间戳可能相同,并且此实验不起作用)
我们可以确认这些文件是相同的:
-X
现在我要将这两个文件中的每一个压缩到自己的档案中。我将zip
标志传递给zip
,这会导致它忽略创建/修改时间等文件属性,这应该是这两个文件之间的唯一区别。请注意,我在每个子目录中运行$ cd a && zip -X ../a.zip 1 && cd -
$ cd b && zip -X ../b.zip 1 && cd -
,以便相对路径也相同。
a.zip
我希望b.zip
和$ md5sum a.zip b.zip
9dedfd0e992695d002c65992452e921c a.zip
49079421fec66cf71969024a06cfd69a b.zip
完全相同,但很奇怪:
$ xxd a.zip > a.bin && xxd b.zip > b.bin && diff a.bin b.bin
1c1
< 00000000: 504b 0304 0a00 0000 0000 8f81 764a 0000 PK..........vJ..
---
> 00000000: 504b 0304 0a00 0000 0000 9081 764a 0000 PK..........vJ..
3c3
< 00000020: 4b01 021e 030a 0000 0000 008f 8176 4a00 K............vJ.
---
> 00000020: 4b01 021e 030a 0000 0000 0090 8176 4a00 K............vJ.
如果我对zip文件的十六进制转储进行区分,我最终会使用
-X
但我不明白zip二进制格式足以在我脑海中解释这一点。毋庸置疑,提取这两个档案会产生相同的文件。
任何人都知道为什么会这样吗? {{1}}标志明显具有某些效果,因为如果我在上面的实验中省略它,则生成的拉链的差异与此处的差异更大。
我只在Linux上使用ext4文件系统对此进行了测试;我不确定OS X或其他文件系统是否会以相同的方式运行。
答案 0 :(得分:1)
我要将-X标志传递给zip,这会导致它忽略文件属性,例如创建/修改时间
它忽略的是额外的属性。
标准属性不受影响。这些是文件名,文件类型,修改日期/时间,CRC和未压缩的大小。
额外属性是特定于系统的扩展,例如Linux的UID,GID,atime和纪元时间的mtime。
其他操作系统对其所关注的属性有其他扩展,例如Windows NT安全描述符或OS / 2特定ACL。
-X
标记剥离这些额外属性,为您留下最小的公分母。