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

Min*_*ine 4 tar

我正在使用tar备份目录。某些文件/目录last-modified-time将被更新,但内容仍然存在。如果目录文件的内容没有被修改,我想得到一个带有二进制文件的 tarball。

但是,只要last-modified-time更新,生成的 tarball 的二进制文件就会不同。

有没有办法让tarignore last-modified-time?这样只要内容不更改,我就可以获得相同的二进制文件。

Ron*_*dom 5

看来您不仅要在 TAR 中寻找固定的 mtime,还要在文件本身相同的情况下寻找逐位相同的 tarball。这实际上比人们想象的要复杂。

根据您的情况,并非所有要点都相关,但为了完整起见,我将它们列在此处。在 GNU tar 中,您可以执行以下操作:

  • 使用--mtime=<date>. 从 1.29 版开始(在 Debian 1.28-1 上,您可以使用--clamp-mtime仅为文件 /newer/ 比给定的 mtime 设置文件的实际 mtime。这很有用,当您想为生成的文件提供一个通用时间戳,但离开单独的其他文件。
  • 要在存档中使用可预测的文件顺序--sort=name(GNU tar 1.28 或更高版本)。默认行为是--sort=none,它按目录顺序存储文件。
  • --owner=0 --group=0 --numeric-owner 设置所有者(如果您从不同的用户创建 TAR)。
  • 由于不同的 umask,权限可能会有所不同。chmod在创建存档之前使用或使用--mode=<CHANGES>更改它们以保持一致。

Reproducible Builds 计划中有一篇关于生成逐位相同档案好文章

本文还为较旧的 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
Run Code Online (Sandbox Code Playgroud)

有关各个选项的信息,请参阅GNU TAR 文档和联机帮助页。