归档文件无时间戳

归档文件无时间戳

我需要确定性地归档一些文件,这样如果文件内容相同,我就会得到相同的归档文件。我需要这个来稍后测试归档文件的相等性。

但是,tar 包含时间戳信息,因此即使文件内容相同,我也会得到不同的存档文件。

我如何创建不包含时间戳信息的档案(使用 tar、zip 或其他文件)?

注意:我知道即使两个 tar 文件不同,我也可以忽略它们的时间戳,只使用tar --diff或等工具比较它们的内容tarsum。但是,由于我的设置,我不能使用任何其他外部工具进行比较;我只能测试两个存档文件是否完全相等。

注意:我知道我可以在归档文件之前将所有文件的时间戳设置为给定值,这样它们的时间戳就会相同。但是文件很多,我不想这样做。我只想归档这些文件而不包含时间戳信息

例子:

$ mkdir copy1
$ touch copy1/file1
$ touch copy1/file2

$ sleep 60
$ mkdir copy2
$ touch copy2/file1
$ touch copy2/file2

$ ls -l copy1
total 0
-rw-r--r--  1 david  wheel  0 Oct 27 00:59 file1
-rw-r--r--  1 david  wheel  0 Oct 27 00:59 file2

$ ls -l copy2
total 0
-rw-r--r--  1 david  wheel  0 Oct 27 01:00 file1
-rw-r--r--  1 david  wheel  0 Oct 27 01:00 file2

# the content of those files is the same; they only differ by the their timestamp    

$ (cd copy1; tar -cvf ../copy1.tar .)
$ (cd copy2; tar -cvf ../copy2.tar .)

$ tar -tvf copy1.tar
drwxr-xr-x  0 david  wheel       0 Oct 27 00:59 ./
-rw-r--r--  0 david  wheel       0 Oct 27 00:59 ./file1
-rw-r--r--  0 david  wheel       0 Oct 27 00:59 ./file2

$ tar -tvf copy2.tar
drwxr-xr-x  0 david  wheel       0 Oct 27 01:00 ./
-rw-r--r--  0 david  wheel       0 Oct 27 01:00 ./file1
-rw-r--r--  0 david  wheel       0 Oct 27 01:00 ./file2

$ diff copy1.tar copy2.tar 
Binary files copy1.tar and copy2.tar differ

我尝试用zip -X代替tar,但得到相同的结果

答案1

即使您以某种方式完全禁用时间戳,我也不能 100% 确定它在任何情况下都能拯救您。事实上,文件的顺序可能会改变结果(即“tar cf a.tar file1 file2”与“tar cf b.tar file2 file1”不同,但根据您的指定,内容是相同的,顺序可能取决于文件系统)。

我建议您做一些比您所说的文件比较更清晰的事情(md5sum等等)。

如果你真的只想要一个哑文件比较来工作,我可能会建议一个普通的 shell,将文件粘贴在文件名头上,例如:

for i in file1 file2; do echo "$i"; cat $i; done; 

当然,如果你愿意,你可以使用 gzip 压缩它。但一定要小心,始终保持顺序。

答案2

为了比较 Zip 档案的内容,您可以使用开源 comp_zip 工具 @https://sourceforge.net/projects/unzip-ada/或者https://github.com/zertovitch/zip-ada/

该命令是comp_zip file1.zip file2.zip;有详细程度的开关。

答案3

您可以使用该选项--mtime设置明确的时间戳:

$ tar --help
...
 Handling of file attributes:
...
      --mtime=DATE-OR-FILE   set mtime for added files from DATE-OR-FILE
...
$ tar --version
tar (GNU tar) 1.29
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

相关内容