1

Учитывая md5sum файла, я хочу знать, есть ли где-нибудь еще в дереве каталогов другой файл с такой же md5sum (но, возможно, под другим именем). Как я могу сделать это в Bash?

PS: чтобы подчеркнуть, это должно работать для всего дерева ниже данного каталога, т.е. должно работать рекурсивно, а не только в текущем каталоге.

3 ответа3

1

Использование find для рекурсивного тестирования всех файлов:

find . -type f -exec \
bash -c 'md5sum "$0" | grep -q 2690d194b68463c5a6dd53d32ba573c7 && echo $0' {} \;

Здесь md5sum выводит сумму MD5 и имя файла. Вам нужно grep его фактической суммы MD5 , как нет переключателя , чтобы он просто вывести сумму в одиночку.

Вы можете проверить сумму MD5 намного проще с md5 если вы используете BSD или OS X:

find . -type f -exec \
bash -c '[ "$(md5 -q "$0")" = 2690d194b68463c5a6dd53d32ba573c7 ] && echo $0' {} \;
1

Другие решения хороши, но я хочу предложить одно с меньшим количеством порожденных процессов, которое должно быть значительно быстрее для многих маленьких файлов, если у вас есть GNU find:

find /path/to/tree -type f -exec md5sum \{\} + | sed -nre 's/^md5-to-search-for  //p'

или без GNU найти:

find /path/to/tree -type f -print0 | xargs -r -0 -- md5sum | sed -nre 's/^md5-to-search-for  //p'
0

Занимая часть решения от slhck, я придумал

find . -type f -print0 | while read -r -d '' f;
do
 md5sum "$f" | grep "$1"
done

Где $ 1 - первый аргумент. Если вы хотите проверить отсутствие аргумента, запустите файл с:

if [ -z "$1" ]
  then
    echo "No argument supplied"
    exit
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .