为什么相同的内容会压缩到不相同的档案,即使使用`-X`?

时间:2017-03-22 20:24:27

标签: linux filesystems zip

所以,让我们创建两个相同的(空)文件。我们必须将它们放在不同的目录中,否则它们不能与相同的文件名共存:

$ 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或其他文件系统是否会以相同的方式运行。

1 个答案:

答案 0 :(得分:1)

  

我要将-X标志传递给zip,这会导致它忽略文件属性,例如创建/修改时间

它忽略的是额外的属性。

标准属性不受影响。这些是文件名,文件类型,修改日期/时间,CRC和未压缩的大小。

额外属性是特定于系统的扩展,例如Linux的UID,GID,atime和纪元时间的mtime。

其他操作系统对其所关注的属性有其他扩展,例如Windows NT安全描述符或OS / 2特定ACL。

-X标记剥离这些额外属性,为您留下最小的公分母。