Назад | Перейти на главную страницу

Хеш-файлы в tar-файле

у меня есть два *.tar файлы с похожим содержимым. Я хочу проверить, какие файлы совпадают. Многие файлы большие, поэтому для сравнения хешей потребуется извлечь каждый файл из каждого tar и вычислить хеш. Есть ли способ хэшировать файлы в tar без необходимости их извлечения? Есть ли другой способ сравнить файлы в двух *.tar файлы?

Если это GNU tar, запустите это:

tar -xf file1.tar --to-command=file-stats-from-tar

где file-stats-from-tar находится где-то в $PATH и является:

#!/bin/bash

md5=`md5sum`;
md5=${md5%% *}

printf "%s\t%s\n" $md5 "$TAR_FILENAME"

+ Изменить md5sum Если вам нужно.

Все это делается за один проход.

Как это работает? --to-command опция указывает tar отправить каждый файл отдельно от указанной вами команды, с набором переменных среды (мы используем только TAR_FILENAME Вот).

Могут быть более эффективные способы, но я смог придумать это за несколько минут:

tar tf test.tar | while read x ; do echo "$(tar xfO test.tar ${x} | md5sum) ${x}" ; done

Первый tar tf просто перечисляет файлы в архиве, который затем передается в while read x цикл bash. Затем для каждого имени файла он находит хеш, используя tar xfO test.tar ${x} | md5sum Очевидно, вы можете заменить md5sum на свой любимый хеш-инструмент. Странное использование echo $() ${x} просто для того, чтобы вывод был похож на обычный вывод хеша со значениями слева и именами файлов справа. Без этого он просто дает вам хэши всех файлов, но не имена, поэтому вы не можете сказать, какие файлы были отправлены. Даже при этом есть лишний столбец - в выводе, которого обычно нет. Его можно легко удалить с помощью colrm команда в конвейере.

Это может быть не самым эффективным, поскольку он должен пройти через tar-файл n + 1 раз, если в нем n файлов, но, надеюсь, содержимое tar кэшируется после первого чтения.