Как я сравниваю два файла, содержащие несколько md5 контрольных сумм для определения измененных файлов?

У меня есть два файла MD1 и MD2.

MD1 содержит md5sums:

5f31caf675f2542a971582442a6625f6  /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreator/hash3.txt

где hash1, hash2 и hash3 три файла, существующие в папке md5filescreator.

Так же MD2 содержит:

163559001ec29c4bbbbe96344373760a  /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30  /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01  /root/md5filescreators/hash3.txt

где эти файлы находятся в папке md5filescreators.

Я хочу сравнить контрольные суммы в md5filescreator с контрольной суммой соответствующего файла в md5filecreators.

Сценарий оболочки должен возвратиться хорошо для файлов с теми же контрольными суммами и ЛОЖЬЮ для тех, которые не являются, наряду с именами файлов.

Может это быть сделанным с помощью md5sum --check (так как это обычно проверяет на какие-либо изменения только в 1 файле MD5)?

6
задан 15 March 2016 в 10:15

2 ответа

Я хочу знать, может ли это быть сделано с помощью md5sum --check? (так как это обычно проверяет на любые изменения только в 1 файле MD5).

Нет, это не может.

md5sum --check предназначен, чтобы считать путь к каждому файлу во втором столбце входных файлов и проверить их контрольную сумму MD5 agains контрольная сумма, о которой сообщают относительно первого столбца; если Вы хотите непосредственно сравнить контрольные суммы в этих двух файлах, необходимо будет сравнить текстовые файлы.

Используя paste + AWK Вы могли сделать:

paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
  • paste file1 file2: строка соединений N file1 на строке N file2;
  • awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}': если первое поле равно третьему полю (т.е. соответствие сумм MD5), присваивается "хорошо" к x, иначе присваивает "ЛОЖЬ" x и печатает второе поле (т.е. имя файла) сопровождаемый значением x.
% cat file1
5f31caf675f2542a971582442a6625f6 /root/md5filescreator/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreator/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreator/hash3.txt
% cat file2
163559001ec29c4bbbbe96344373760a /root/md5filescreators/hash1.txt
4efe4ba4ba9fd45a29a57893906dcd30 /root/md5filescreators/hash2.txt
1364cdba38ec62d7b711319ff60dea01 /root/md5filescreators/hash3.txt
% paste file1 file2 | awk '{x = $1 == $3 ? "OK" : "FALSE"; print $2" "x}'
/root/md5filescreator/hash1.txt FALSE
/root/md5filescreator/hash2.txt OK
/root/md5filescreator/hash3.txt OK
5
ответ дан 23 November 2019 в 07:38

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

sort file1 file2 | uniq --unique

uniq --unique печать те строки, которые не появились снова . Соответственно, те файлы, соответствие хешей которых копирует строки и не появится в выводе. Чтобы просто протестировать, если вывод производится, используйте grep:

sort file1 file2 | uniq --unique | grep -q .

В этом случае, так как каталоги отличаются, немного больше обработки необходимо:

awk -F/ '{print $1, $NF}' | sort | uniq --unique | awk '!a[$2]++{print $2}'

Или, полностью в awk:

awk -F/ 'FNR == NR {hash[$NF] = $1; next} hash[$NF] != $1 {print $NF}'

В обоих случаях, Вы получаете просто имена файлов, хеши которых отличаются.

3
ответ дан 23 November 2019 в 07:38

Другие вопросы по тегам:

Похожие вопросы: