Я запустил тест, создав два tars из одного и того же каталога (его файлы остались без изменений), и обнаружил, что их md5sum были разными. Я предполагаю, что в заголовок tar включена какая-то временная метка, но я не нашел способа отменить ее. Моя ОС - Ubuntu 9.1. Любые идеи ?
Спасибо.
Как указал Деннис, это gzip. Часть заголовка gzip - это время модификации всего, что сжато в файле. Если вам нужен gzip, вы можете сжать tar-файл в качестве дополнительного шага за пределами tar, а не использовать внутренний gzip tar. У команды gzip есть флаг, запрещающий сохранение времени модификации.
tar -c ./bin |gzip -n >one.tgz
tar -c ./bin |gzip -n >two.tgz
md5sum one.tgz two.tgz
Это не повлияет на время внутри tar-файла, только на время в заголовке gzip.
Чтобы создать tar-файл с согласованной контрольной суммой, просто добавьте GZIP=-n
как это:
GZIP=-n tar -zcf myOutputTarball.tar /home/luke/directoryIWantToZip
Как это работает: Tar может принимать параметры gzip с помощью временного GZIP
переменная окружения, как указано выше. Как сказал Вальтер, tar использует gzip, который по умолчанию помещает метку времени в архив. Это означает, что при сжатии одних и тех же файлов вы получаете другую контрольную сумму. В -n
опция отключает эту метку времени.
У меня тоже была эта проблема, чтобы gzip не изменял метку времени, используйте gzip -n
-n, --no-name не сохранять и не восстанавливать исходное имя и отметку времени
[valter.silva@alog ~]$ gzip --help
Usage: gzip [OPTION]... [FILE]...
Compress or uncompress FILEs (by default, compress FILES in-place).
Mandatory arguments to long options are mandatory for short options too.
-c, --stdout write on standard output, keep original files unchanged
-d, --decompress decompress
-f, --force force overwrite of output file and compress links
-h, --help give this help
-l, --list list compressed file contents
-L, --license display software license
-n, --no-name do not save or restore the original name and time stamp
-N, --name save or restore the original name and time stamp
-q, --quiet suppress all warnings
-r, --recursive operate recursively on directories
-S, --suffix=SUF use suffix SUF on compressed files
-t, --test test compressed file integrity
-v, --verbose verbose mode
-V, --version display version number
-1, --fast compress faster
-9, --best compress better
--rsyncable Make rsync-friendly archive
With no FILE, or when FILE is -, read standard input.
Report bugs to <bug-gzip@gnu.org>.
Пример:
[valter.silva@alog ~]$ ls
renewClaroMMSCanaisSemanal.log.gz s3
[valter.silva@alog ~]$ gunzip renew.log.gz
[valter.silva@alog ~]$ gunzip s3/renew.log.gz
[valter.silva@alog ~]$ md5sum renew.log
d41d8cd98f00b204e9800998ecf8427e renew.log
[valter.silva@alog ~]$ md5sum s3/renew.log
d41d8cd98f00b204e9800998ecf8427e s3/renew.log
[valter.silva@alog ~]$ gzip -n renew.log
[valter.silva@alog ~]$ gzip -n s3/renew.log
[valter.silva@alog ~]$ md5sum renew.log.gz
7029066c27ac6f5ef18d660d5741979a renew.log.gz
[valter.silva@alog ~]$ md5sum s3/renew.log.gz
7029066c27ac6f5ef18d660d5741979a s3/renew.log.gz
Я пошел в кроличью нору после того, как другие ответы не помогли мне, и мне удалось выяснить, что моя версия 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
Обратите внимание, что приведенный выше вывод отличается, хотя сжатие не используется.; несжатое содержимое архива (сгенерированное двойным запуском tar для одного и того же содержимого) отличается, поэтому сжатое содержимое также будет отличаться даже при использовании 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