файлы различий, сравнивающие только первые n символов каждой строки

#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