Я пішов по кролячій норі після того, як інші відповіді мені не вдалися, і мені вдалося з'ясувати, що моя версія tar (1.27.1 від репорту openSUSE 42.3 OSS) використовує недетермінований pax
архівний формат за замовчуванням, а це означає, що навіть без стиснення (і навіть встановлення mtime явно) архіви, створені за допомогою tar з тих самих файлів, будуть відрізнятися:
$ 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
Зауважте, що вихідний результат відрізняється, навіть якщо не використовується компресія ; вміст нестисненого архіву (згенерований за допомогою тарінгу двічі на одному і тому ж вмісті) відрізняється, тому стислий вміст також відрізнятиметься навіть при використанні, GZIP=-n
як підказують інші відповіді
Щоб обійти це, ви можете вказати --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
Це працює з пропозицією про 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
Однак, крім вагомих причин віддати перевагу кращим форматам стиснення перед gzip , ви можете подумати про використання xz (який tar також підтримує з --xz
або -J
прапорами замість -z
), оскільки це економить вам крок тут; поведінка за замовчуванням xz
- це генерувати той же стислий вихід, коли нестиснений вміст однаковий, тому немає необхідності вказувати такий варіант, як 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
зміні модифікованого часу файлу достатньо, щоб змінити контрольну суму.