Tar 每次生成不同的文件

Tar 每次生成不同的文件

我经常有大型目录想要从服务器传输到本地计算机。我通常会先使用目录,然后再传输它,而不是使用递归scprsync目录本身。targzip

最近,我想检查这是否确实有效,因此我在同一源目录的两个独立生成的存档tar上运行 md5sum 。gzip令我惊讶的是,MD5 哈希值不同。我又这样做了两次,它总是一个新值。为什么我会看到这个结果?两个 tar 和 gzipped 目录是否都是使用相同版本的 GNU tar 以完全相同的方式生成的,不应该完全相同吗?

为了清楚起见,我有一个源目录和一个目标目录。在目标目录中,我有 dir1 和 dir2。我在跑:

tar -zcvf /destination/dir1/source.tar.gz source && md5sum /destination/dir1/source.tar.gz >> md5.txt

tar -zcvf /destination/dir2/source.tar.gz source && md5sum /destination/dir2/source.tar.gz >> md5.txt

每次执行此操作时,我都会从 md5sum 得到不同的结果。 Tar 不会产生错误或警告。

答案1

从看起来你可能被咬的东西来看gzip时间戳;为了避免这些,运行

GZIP=-n tar -zcvf ...

请注意,要获得完全可重现的 tarball,您还应该强加使用的排序顺序tar:

GZIP=-n tar --sort=name -zcvf ...

如果您的版本tar不支持--sort,请改用:

find source -print0 | LC_ALL=C sort -z | GZIP=-n tar --no-recursion --null -T - -zcvf ...

答案2

在 Mac 上,@stephen-kitt 的答案对我不起作用,不完全确定为什么,但是当我将 gzip 与 tar 命令分开时,它开始生成相同的哈希值。这就是我最终得到的结果:

outputpath="$(pwd)/folder_to_zip" 
find "$outputpath" -print0 | LC_ALL=C sort -z | tar -s "#$outputpath/##" --no-recursion --null -T - -cf - | gzip -n > "$outputpath.tar.gz" && md5 "$outputpath.tar.gz"

相关内容