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

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

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

решение1

Если это 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здесь).

решение2

Возможно, есть более эффективные способы, но мне удалось придумать следующее за несколько минут:

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команды в конвейере.

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

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