如何使 tar 忽略文件/目录的上次修改时间

如何使 tar 忽略文件/目录的上次修改时间

我用来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 文档以及有关各个选项的信息的联机帮助页。

相关内容