压缩两个相同的文件夹会产生不同的结果

lvi*_*ani 8 tar files reproducible-build

我有两个相同的文件夹,具有相同的结构和内容,如下所示:

folder_1
  hello.txt
  subfolder
    byebye.txt

folder_2
  hello.txt
  subfolder
    byebye.txt
Run Code Online (Sandbox Code Playgroud)

如果我将它们压缩为 tar.xz 格式,我会得到两个具有两种不同文件大小的不同存档(只有几个字节,但它们并不相同)。

$ cd folder_1 && tar -Jcf archive.tar.xz *
$ cd folder_2 && tar -Jcf archive.tar.xz *
Run Code Online (Sandbox Code Playgroud)

我得到:

folder_1/archive.tar.xz != folder_2/archive.tar.xz
Run Code Online (Sandbox Code Playgroud)

当然,如果我md5sumsha1sum他们我会得到两个不同的哈希值

这就是我的问题......我需要检查提供的档案是否与我存储中的档案相同。我不能使用散列,也不能只检查文件大小。

使用 zip 而不是 tar.xz 可以工作,因为 zip 总是从相同的文件产生相同的 achives。为什么会这样?有什么办法可以预防吗?

lvi*_*ani 8

好的,ddnomad 给出的解释是正确的。这是关于时间戳的。

这是解决方案:

添加--mtime='1970-01-01 00:00:00'到 tar 命令:

tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *
Run Code Online (Sandbox Code Playgroud)

这将强制内容时间戳为固定值,从而导致相同的档案。

  • 看起来你要使用 Unix 纪元时间,如果是这种情况,那么你可以使用 `--mtime=@0` 。仅供参考,像您所做的那样将 mtime 设置为 1970 有一些歧义 - 在我的系统上,导致 Unix 时间为 25200(将“UTC”添加到字符串中以真正获得 0 的 Unix 时间)。 (2认同)