файлы сравнения, сравнивающие только первые n символов каждой строки - PullRequest
15 голосов
/ 18 мая 2011

У меня есть 2 файла.Давайте назовем их md5s1.txt и md5s2.txt.Оба содержат вывод команды

find -type f -print0 | xargs -0 md5sum | sort > md5s.txt

в разных каталогах.Многие файлы были переименованы, но содержимое осталось прежним.Следовательно, они должны иметь одинаковую сумму md5.Я хочу создать diff как

diff md5s1.txt md5s2.txt

, но он должен сравнивать только первые 32 символа каждой строки, т.е. только md5sum, а не имя файлаСтроки с одинаковой суммой md5 следует считать равными.Вывод должен быть в нормальном формате diff.

Ответы [ 3 ]

15 голосов
/ 18 мая 2011

Легкий стартер:

diff <(cut -d' ' -f1 md5s1.txt)  <(cut -d' ' -f1 md5s2.txt)

Также рассмотрим только

diff -EwburqN folder1/ folder2/
2 голосов
/ 18 сентября 2011

Сравните только столбец md5, используя diff на <(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 <&3; ((lnum++)); done;
        echo $line;
    done
) 3<md5sums.sort.XXX
1 голос
/ 18 сентября 2011

Если вы ищете дубликаты файлов, fdupes может сделать это для вас:

$ fdupes --recurse

В Ubuntu вы можете установить его, выполнив

$ apt-get install fdupes
...