Sono andato in una tana di coniglio dopo che le altre risposte mi hanno fallito e sono riuscito a capire che la mia versione di tar (1.27.1 dal repository OSS openSUSE 42.3) utilizzava il pax
formato di archivio non deterministico di default, il che significa che anche senza compressione (e persino l'impostazione esplicita di mtime) gli archivi creati con tar dagli stessi file differirebbero:
$ 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
Si noti che l'output sopra differisce, anche se non viene utilizzata alcuna compressione ; il contenuto dell'archivio non compresso (generato eseguendo tar due volte sullo stesso contenuto) è diverso, quindi anche il contenuto compresso differirà anche quando lo si usa GZIP=-n
come suggeriscono altre risposte
Per ovviare a questo, è possibile specificare --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
Questo funziona con il suggerimento su gzip sopra:
# 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
Tuttavia, oltre a validi motivi per preferire migliori formati di compressione a gzip , potresti prendere in considerazione l'uso di xz invece (che tar supporta anche con i flag --xz
o -J
anziché -z
), perché ti fa risparmiare un passaggio qui; il comportamento predefinito di xz
è generare lo stesso output compresso quando i contenuti non compressi sono gli stessi, quindi non è necessario specificare un'opzione come GZIP=-n
:
$ 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
che modifica il tempo modificato di un file è sufficiente per cambiare il checksum.