为什么相同的内容会压缩到不同的档案中,即使使用“-X”也是如此?
Why are identical contents zipping to non-identical archives, even with `-X`?
那么,让我们创建两个相同的(空的)文件。我们必须将它们放在不同的目录中,否则它们不能以相同的文件名共存:
$ mkdir a b
$ touch a/1
$ touch b/1
(注意:不要在单个命令中执行 $ touch a/1 b/1
,因为那样文件创建时间戳可能相同,此实验将无法进行)
我们可以确认这些文件是相同的:
$ md5sum a/1 b/1
d41d8cd98f00b204e9800998ecf8427e a/1
d41d8cd98f00b204e9800998ecf8427e b/1
现在我要将这两个文件分别压缩到它们自己的存档中。我要将 -X
标志传递给 zip
,这会导致它忽略文件属性,例如 creation/modification 时间,这应该是这两个文件之间的唯一区别。请注意,我在每个子目录中 运行 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
如果我比较 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
标志显然具有 一些 效果,因为如果我在上面的实验中省略它,生成的 zips 的差异甚至比这里的差异更大。
我只在 Linux 上用 ext4 文件系统测试过这个;我不确定 OS X 或其他文件系统是否会以相同的方式运行。
I'm going to pass the -X flag to zip, which causes it to ignore file attributes like the creation/modification time
它忽略的是额外的属性。
标准属性不受影响。这些是文件名、文件类型、修改 date/time、CRC 和未压缩大小。
额外属性是系统特定的扩展,例如 Linux 的 UID、GID、atime 和 mtime(纪元时间)。
其他 OS 对他们关心的属性有其他扩展,例如 Windows NT 安全描述符或 OS/2 特定 ACL。
-X
标志去除了这些额外的属性,让您拥有最小的公分母。
那么,让我们创建两个相同的(空的)文件。我们必须将它们放在不同的目录中,否则它们不能以相同的文件名共存:
$ mkdir a b
$ touch a/1
$ touch b/1
(注意:不要在单个命令中执行 $ touch a/1 b/1
,因为那样文件创建时间戳可能相同,此实验将无法进行)
我们可以确认这些文件是相同的:
$ md5sum a/1 b/1
d41d8cd98f00b204e9800998ecf8427e a/1
d41d8cd98f00b204e9800998ecf8427e b/1
现在我要将这两个文件分别压缩到它们自己的存档中。我要将 -X
标志传递给 zip
,这会导致它忽略文件属性,例如 creation/modification 时间,这应该是这两个文件之间的唯一区别。请注意,我在每个子目录中 运行 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
如果我比较 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
标志显然具有 一些 效果,因为如果我在上面的实验中省略它,生成的 zips 的差异甚至比这里的差异更大。
我只在 Linux 上用 ext4 文件系统测试过这个;我不确定 OS X 或其他文件系统是否会以相同的方式运行。
I'm going to pass the -X flag to zip, which causes it to ignore file attributes like the creation/modification time
它忽略的是额外的属性。
标准属性不受影响。这些是文件名、文件类型、修改 date/time、CRC 和未压缩大小。
额外属性是系统特定的扩展,例如 Linux 的 UID、GID、atime 和 mtime(纪元时间)。
其他 OS 对他们关心的属性有其他扩展,例如 Windows NT 安全描述符或 OS/2 特定 ACL。
-X
标志去除了这些额外的属性,让您拥有最小的公分母。