归档文件不带时间戳

Dav*_*lla 6 zip tar

我需要确定性地归档一些文件,以便在文件内容相同的情况下获得相同的归档文件。我需要这个来测试存档文件的相等性。

但是,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
Run Code Online (Sandbox Code Playgroud)

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

小智 0

即使您以某种方式完全禁用时间戳,我也不能 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; 
Run Code Online (Sandbox Code Playgroud)

如果您愿意,当然可以对其进行 gzip 压缩。并注意始终保留顺序。