我用来tar
备份目录。某些文件/目录last-modified-time
将被更新,但内容仍然保留。如果目录文件的内容未修改,我想获得包含二进制文件的 tarball。
然而,只要last-modified-time
更新,生成的 tarball 的二进制文件就会不同。
有没有办法让tar
忽略last-modified-time
?这样只要内容不改变我就可以获得相同的二进制文件。
答案1
看来您不仅在 TAR 中寻找固定的 mtime,而且在文件本身相同的情况下寻找逐位相同的 tarball。这实际上比人们想象的要复杂。
根据您的情况,并非所有要点都可能相关,但为了完整性,我将它们列在这里。在 GNU tar 中,您可以执行以下操作:
- 使用设置 mtime
--mtime=<date>
。从版本 1.29 开始(在 Debian 1.28-1 上,您可以--clamp-mtime
仅对比给定 mtime 更新的文件/较新的文件设置文件的实际 mtime。当您想要为生成的文件提供公共时间戳但保留文件时,这很有用)单独的其他文件。 - 要在存档中使用可预测的文件顺序
--sort=name
(GNU tar 1.28 或更高版本)。默认行为是--sort=none
,它按目录顺序存储文件。 --owner=0 --group=0 --numeric-owner
设置所有者(如果您从不同的用户创建 TAR)。- 由于 umask 不同,权限可能会有所不同。
chmod
在创建存档之前使用或用于--mode=<CHANGES>
更改它们以保持一致。
可重复构建计划有一个关于生成逐位相同档案的好文章。
本文还提供了针对旧 tar 版本的一些解决方法,这些方法可能也适用于其他 TAR 实现。针对 mtime 的一个具体解决方法是,您可以touch
在创建 TAR 之前使用它来将 mtime 设置为特定日期之前所有文件的固定值。为了在存档中实现可预测的顺序,请使用find
并将sort
有序文件列表传递给 TAR。
find build -print0 | LC_ALL=C sort -z
| tar --no-recursion --null -T - -cf product.tar
请参阅GNU TAR 文档以及有关各个选项的信息的联机帮助页。