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