Мне нужно архивировать некоторые файлы детерминированно, так что я получу тот же файл архива, если содержимое файлов одинаковое. Мне это нужно для проверки на эквивалентность файлов архива позже.
Однако tar включает в себя информацию о временных метках, и поэтому я получаю разные архивные файлы, даже если содержимое файлов одинаковое.
как создать архив (tar, zip или что-то еще), не содержащий информации о временных метках?
Примечание: Я знаю, что даже если два tar-файла различаются, я могу игнорировать их временные метки и сравнивать только их содержимое с помощью таких инструментов, как tar --diff
или tarsum
. Однако мне не разрешено использовать какой-либо другой внешний инструмент для сравнения (из-за моей настройки); я могу просто проверить два архивных файла на полное равенство.
Примечание: Я знаю, что могу установить временную метку всех файлов на заданное значение перед архивацией файлов, так что их временные метки будут одинаковыми. Однако файлов много, и я не хочу этого делать. Я просто хочу архивировать эти файлы без информации о временных метках
пример:
$ mkdir copy1
$ touch copy1/file1
$ touch copy1/file2
$ sleep 60
$ mkdir copy2
$ touch copy2/file1
$ touch copy2/file2
$ ls -l copy1
total 0
-rw-r--r-- 1 david wheel 0 Oct 27 00:59 file1
-rw-r--r-- 1 david wheel 0 Oct 27 00:59 file2
$ ls -l copy2
total 0
-rw-r--r-- 1 david wheel 0 Oct 27 01:00 file1
-rw-r--r-- 1 david wheel 0 Oct 27 01:00 file2
# the content of those files is the same; they only differ by the their timestamp
$ (cd copy1; tar -cvf ../copy1.tar .)
$ (cd copy2; tar -cvf ../copy2.tar .)
$ tar -tvf copy1.tar
drwxr-xr-x 0 david wheel 0 Oct 27 00:59 ./
-rw-r--r-- 0 david wheel 0 Oct 27 00:59 ./file1
-rw-r--r-- 0 david wheel 0 Oct 27 00:59 ./file2
$ tar -tvf copy2.tar
drwxr-xr-x 0 david wheel 0 Oct 27 01:00 ./
-rw-r--r-- 0 david wheel 0 Oct 27 01:00 ./file1
-rw-r--r-- 0 david wheel 0 Oct 27 01:00 ./file2
$ diff copy1.tar copy2.tar
Binary files copy1.tar and copy2.tar differ
Я попробовал zip -X
вместо tar
, но результат тот же
решение1
Даже если вы каким-то образом полностью отключите временную метку, я не был бы на 100% уверен, что это спасет вас в каждом случае. Фактически, порядок файлов может изменить результаты (например, "tar cf a.tar file1 file2" отличается от "tar cf b.tar file2 file1", но по вашим спецификациям содержимое одинаковое, а порядок может зависеть от файловой системы).
Я бы предложил вам сделать что-то более конкретное, чем просто сравнение файлов, как вы сказали (md5sum и т. д.).
Если вам действительно нужно простое сравнение файлов, я могу предложить простую оболочку, которая скрепляет файлы с заголовком имени файла, например:
for i in file1 file2; do echo "$i"; cat $i; done;
Конечно, вы можете сжать его, если хотите. И будьте осторожны, чтобы всегда сохранять порядок.
решение2
Для сравнения содержимого ZIP-архивов вы можете использовать инструмент с открытым исходным кодом comp_zip @https://sourceforge.net/projects/unzip-ada/илиhttps://github.com/zertovitch/zip-ada/.
Команда — comp_zip file1.zip file2.zip
; есть переключатели для детализации.
решение3
Вы можете использовать опцию --mtime
для установки явной временной метки:
$ tar --help
...
Handling of file attributes:
...
--mtime=DATE-OR-FILE set mtime for added files from DATE-OR-FILE
...
$ tar --version
tar (GNU tar) 1.29
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by John Gilmore and Jay Fenlason.