У меня есть два *.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 кэшируется после первого чтения.