архивация файлов без временной метки

архивация файлов без временной метки

Мне нужно архивировать некоторые файлы детерминированно, так что я получу тот же файл архива, если содержимое файлов одинаковое. Мне это нужно для проверки на эквивалентность файлов архива позже.

Однако 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.

Связанный контент