Ich muss einige Dateien deterministisch archivieren, so dass ich dieselbe Archivdatei erhalte, wenn der Inhalt der Dateien gleich ist. Dies benötige ich, um später die Gleichheit der Archivdateien zu testen.
Tar enthält jedoch die Zeitstempelinformationen, sodass ich unterschiedliche Archivdateien erhalte, auch wenn der Inhalt der Dateien derselbe ist.
wie kann ich ein Archiv (mit Tar, Zip oder etwas anderem) erstellen, das keine Zeitstempelinformationen enthält?
Hinweis: Mir ist bewusst, dass ich, auch wenn die beiden Tar-Dateien unterschiedlich sind, ihre Zeitstempel ignorieren und nur ihren Inhalt mit Tools wie tar --diff
oder vergleichen kann tarsum
. Allerdings darf ich (aufgrund meines Setups) kein anderes externes Tool zum Vergleichen verwenden; ich kann die beiden Archivdateien nur auf exakte Gleichheit testen.
Hinweis: Mir ist bewusst, dass ich den Zeitstempel aller Dateien vor dem Archivieren auf einen bestimmten Wert setzen könnte, sodass ihre Zeitstempel gleich wären. Es gibt jedoch viele Dateien, und das möchte ich nicht tun. Ich möchte diese Dateien einfach ohne Zeitstempelinformationen archivieren.
Beispiel:
$ 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
Ich habe es mit zip -X
anstelle von versucht tar
, aber ich erhalte das gleiche Ergebnis
Antwort1
Selbst wenn Sie den Zeitstempel irgendwie vollständig deaktivieren, wäre ich nicht 100 % sicher, ob Sie dadurch in jedem Fall gerettet werden. Tatsächlich könnte die Reihenfolge der Dateien die Ergebnisse ändern (d. h. „tar cf a.tar file1 file2“ unterscheidet sich von „tar cf b.tar file2 file1“, aber nach Ihrer Spezifikation ist der Inhalt derselbe und die Reihenfolge kann vom Dateisystem abhängig sein).
Ich würde vorschlagen, dass Sie etwas Genaueres tun müssen als nur einen Dateivergleich, wie Sie gesagt haben (md5sum usw.).
Wenn Sie zum Vergleichen wirklich nur eine einfache Datei benötigen, empfehle ich eine einfache Shell, die die Dateien mit einem Dateinamen-Header wie dem folgenden versieht:
for i in file1 file2; do echo "$i"; cat $i; done;
Sie können es natürlich gzippen, wenn Sie möchten. Und achten Sie darauf, dass die Reihenfolge immer erhalten bleibt.
Antwort2
Zum Vergleichen der Inhalte von Zip-Archiven können Sie das Open-Source-Tool comp_zip verwenden @https://sourceforge.net/projects/unzip-ada/oderhttps://github.com/zertovitch/zip-ada/.
Der Befehl lautet comp_zip file1.zip file2.zip
; es gibt Schalter für die Ausführlichkeit.
Antwort3
Sie können die Option verwenden, --mtime
um einen expliziten Zeitstempel festzulegen:
$ 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.