歸檔文件不帶時間戳

歸檔文件不帶時間戳

我需要確定性地歸檔一些文件,以便在文件內容相同的情況下獲得相同的歸檔文件。我需要這個來測試存檔文件的相等性。

但是,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.

相關內容