Nachdem die anderen Antworten versagt hatten, bin ich in ein Kaninchenbaugebiet gefahren und habe herausgefunden, dass meine Version von tar (1.27.1 aus openSUSE 42.3 OSS repo) pax
standardmäßig das nicht deterministische Archivierungsformat verwendet, was sogar bedeutet Ohne Komprimierung (und sogar ohne explizite Einstellung der mtime) würden sich Archive, die mit tar aus denselben Dateien erstellt wurden, unterscheiden:
$ echo hi > test.file
$ tar --create --to-stdout test.file # long form of `tar cO test.file`
./PaxHeaders.13067/test.file0000644000000000000000000000013213427447703012603 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
$ tar --create --to-stdout test.file
./PaxHeaders.13096/test.file0000644000000000000000000000013213427447703012605 xustar0030 mtime=1549684675.835011178
30 atime=1549684726.410510251
30 ctime=1549684675.835011178
test.file0000644000175000001440000000000313427447703013057 0ustar00hartusers00000000000000hi
Beachten Sie, dass die Ausgabe oben unterschiedlich ist, obwohl keine Komprimierung verwendet wird . Die unkomprimierten Archivinhalte (die durch zweimaliges Ausführen von tar auf denselben Inhalten generiert werden) sind unterschiedlich, sodass sich die komprimierten Inhalte auch dann unterscheiden, wenn sie verwendet werden, GZIP=-n
wie andere Antworten vermuten lassen
Um dies zu umgehen, können Sie Folgendes angeben --format gnu
:
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
$ tar --create --format gnu --to-stdout test.file
test.file0000644000175000001440000000000313427447703011557 0ustar hartusershi
Dies funktioniert mit dem obigen Vorschlag zu gzip:
# gzip refuses to write to stdout, so we'll use the `-f` option to create a file
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
$ GZIP=-n tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
0d8c7b3bdbe8066b516e3d3af60ade75 test.file.tgz
# without GZIP=-n we see a different hash
$ tar --format gnu -czf test.file.tgz test.file && md5sum test.file.tgz
682ce0c8267b90f4103b4c29903c5a8d test.file.tgz
Zusätzlich zu den triftigen Gründen, bessere Komprimierungsformate gegenüber gzip zu bevorzugen , können Sie auch die Verwendung von xz in Betracht ziehen (was tar auch mit den Flags --xz
oder -J
anstelle von unterstützt -z
), da Sie hier einen Schritt sparen. Das Standardverhalten von xz
ist, die gleiche komprimierte Ausgabe zu generieren, wenn die unkomprimierten Inhalte gleich sind. Es ist daher nicht erforderlich, eine Option wie die GZIP=-n
folgende anzugeben :
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
$ tar --format gnu --xz -cf test.file.txz test.file && md5sum test.file.txz
dea99037d4b0ee4565b3639e93ac0930 test.file.txz
touch filename
wenn sich die Änderungszeit einer Datei ändert, reicht dies aus, um die Prüfsumme zu ändern.