Bajé por una madriguera de conejo después de que las otras respuestas me fallaran, y logré darme cuenta de que mi versión de tar (1.27.1 del repositorio openSUSE 42.3 OSS) estaba usando el pax
formato de archivo no determinista por defecto, lo que significa que incluso sin compresión, (e incluso configurando el mtime explícitamente) los archivos creados con tar a partir de los mismos archivos serían diferentes:
$ 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
Tenga en cuenta que la salida anterior difiere, aunque no se esté utilizando compresión ; el contenido del archivo sin comprimir (generado al ejecutar tar dos veces en el mismo contenido) es diferente, por lo que el contenido comprimido también diferirá incluso cuando se use, GZIP=-n
como sugieren otras respuestas
Para evitar esto, puede especificar --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
Esto funciona con la sugerencia sobre gzip anterior:
# 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
Sin embargo, además de razones válidas para preferir mejores formatos de compresión a gzip , es posible que desee considerar usar xz en su lugar (que tar también admite con las banderas --xz
o en -J
lugar de -z
), porque le ahorra un paso aquí; El comportamiento predeterminado de xz
es generar la misma salida comprimida cuando el contenido sin comprimir es el mismo, por lo que no es necesario especificar una opción como 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
que cambia el tiempo modificado de un archivo es suficiente para cambiar la suma de verificación.