#linux #comparison #diff #md5 #md5sum
#linux #сравнение #разница #md5 #md5sum
Вопрос:
У меня есть 2 файла. Давайте назовем их md5s1.txt и md5s2.txt . Оба содержат выходные данные a
find -type f -print0 | xargs -0 md5sum | sort > md5s.txt
команда в разных каталогах. Многие файлы были переименованы, но содержимое осталось прежним. Следовательно, они должны иметь одинаковый md5sum. Я хочу сгенерировать различие, подобное
diff md5s1.txt md5s2.txt
но он должен сравнивать только первые 32 символа каждой строки, т. Е. только md5sum, а не имя файла. Строки с равным значением md5sum следует считать равными. Выходные данные должны быть в обычном формате diff.
Ответ №1:
Простой старт:
diff <(cut -d' ' -f1 md5s1.txt) <(cut -d' ' -f1 md5s2.txt)
Кроме того, рассмотрим только
diff -EwburqN folder1/ folder2/
Комментарии:
1. Расширяя этот ответ, если вам действительно нужны n символов, что-то вроде:
diff <(cut -b-80 dump.csv) <(cut -b-80 dump2.csv)
(здесь,n
= 80)
Ответ №2:
Сравните только столбец md5, используя diff
on <(cut -c -32 md5sums.sort.XXX)
, и укажите diff
, чтобы выводились только номера строк добавленных или удаленных строк, используя --old/new-line-format='%dn'$'n'
. Вставьте это в ed md5sums.sort.XXX
, чтобы он печатал только те строки из md5sums.sort.XXX
файла.
diff
--new-line-format='%dn'$'n'
--old-line-format=''
--unchanged-line-format=''
<(cut -c -32 md5sums.sort.old)
<(cut -c -32 md5sums.sort.new)
| ed md5sums.sort.new
> files-added
diff
--new-line-format=''
--old-line-format='%dn'$'n'
--unchanged-line-format=''
<(cut -c -32 md5sums.sort.old)
<(cut -c -32 md5sums.sort.new)
| ed md5sums.sort.old
> files-removed
Проблема с ed
заключается в том, что он загрузит весь файл в память, что может быть проблемой, если у вас много контрольных сумм. Вместо того, чтобы передавать вывод diff в ed
, передайте его в следующую команду, которая будет использовать гораздо меньше памяти.
diff … | (
lnum=0;
while read lprint; do
while [ $lnum -lt $lprint ]; do read line <amp;3; ((lnum )); done;
echo $line;
done
) 3<md5sums.sort.XXX
Ответ №3:
Если вы ищете дубликаты файлов, fdupes может сделать это за вас:
$ fdupes --recurse
В Ubuntu вы можете установить его, выполнив
$ apt-get install fdupes