我有两个相同的文件夹,具有相同的结构和内容,如下所示:
folder_1
hello.txt
subfolder
byebye.txt
folder_2
hello.txt
subfolder
byebye.txt
如果我将它们压缩为 tar.xz 格式,我会得到两个不同的存档,具有两种不同的文件大小(只有几个字节,但它们并不相同)。
$ cd folder_1 && tar -Jcf archive.tar.xz *
$ cd folder_2 && tar -Jcf archive.tar.xz *
我得到:
folder_1/archive.tar.xz != folder_2/archive.tar.xz
当然,如果我md5sum
或sha1sum
他们我会得到两个不同的哈希值
这就是我的问题...我需要检查提供的存档是否与我存储中的存档相同。我不能使用散列,也不能仅检查文件大小。
使用 zip 而不是 tar.xz 可以正常工作,因为 zip 总是从相同的文件生成相同的档案。为什么会发生这种情况?有办法预防吗?
答案1
好的,ddnomad 给出的解释是正确的。这是关于时间戳的。
这是解决方案:
添加--mtime='1970-01-01 00:00:00'
到 tar 命令:
tar --mtime='1970-01-01 00:00:00' -Jcf archive.tar.xz *
这将强制内容时间戳为固定值,从而产生相同的存档。
答案2
同一目录树的两个 tarball 可能不同的原因有很多。主要有:
所有权、时间戳等元数据可能有所不同。要获得可复制的 tar 存档,您需要具有相同的所有权、权限和时间戳。确保您复制了所有元数据(如果您具有相同的文件内容和不同的元数据,
cp -a --attributes-only
可能会有所帮助)。使用 GNU tar,您可以使用一些选项来忽略某些属性:--numeric-owner
只存储数字用户和组 ID,而不存储名称。--owner
并--group
强制文件分别记录在某个用户和组下(例如--owner=0 --group=0
将所有文件记录为属于root)。--set-mtime
允许您存储具有特定时间戳而不是真实时间戳的所有文件。
文件的存储顺序可能有所不同。大多数文件系统对于文件在目录中列出的顺序不提供任何特定的保证,并按文件
tar
出现时列出它们。 (您可以通过 来查看命令ls -U
。)GNU tar 1.28 有一个新选项--sort=name
。对于旧版本或其他实现,您可以通过构建文件名的排序列表并将其传递给 tar 来获得可重现的文件顺序:find . -print0 | LC_ALL=C sort -z | tar --no-recursion -Jcf ../archive.tar.xz -T -
您可能感兴趣关于可重复构建的 Debian wiki 页面。
答案3
每个文件(文件夹也是文件)都有一个嵌入的时间戳。
我认为您无法同时创建这些文件夹结构,因此这些文件的时间戳是不同的。
因此,归档或散列会给您带来不同的结果,因为时间戳是这两种操作中使用的文件的一部分。
这就是看似相同的文件结构之间的差异。
更新:截至检查它们具有相似的内容时,我想您实际上必须检查这些文件的内容并比较它们。