Поиск файла по md5sum

1464
gojira

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

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

1

3 ответа на вопрос

2
slhck

Использование 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' {} \; 
Спасибо, slhck выглядит очень интересно, но, очевидно, моя команда md5 не имеет опции -q; ни одна из моих команд md5sum. Я использую Xubuntu. И что такое {} \ for? gojira 10 лет назад 0
Извините, у меня был неправильный инструмент BSD `md5`. В Linux вам нужен `md5sum`. Я исправлю свой пост, когда вернусь на компьютер. {} - это путь к файлу для каждого найденного файла. Он передается в `sh`. \; просто завершает вызов exec slhck 10 лет назад 0
2
David Foerster

Другие решения хороши, но я хочу предложить одно с меньшим количеством порожденных процессов, которое должно быть значительно быстрее для многих маленьких файлов, если у вас есть 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' 
1
tbrixen

Занимая часть решения от 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 
Это ломается, если файлы содержат пробелы в своем пути. Для перебора файлов вы должны использовать `find` с` exec` или globbing (например, `**`) slhck 10 лет назад 0
Другим вариантом будет использование `-print0` в вашей команде` find` и `xargs -0`. Так что, в этом случае, `найти. тип f -print0 | xargs -0 md5 | grep (ваш код MD5) ` Kent 10 лет назад 0
Мне очень нравится это решение. Однако он дает мне массу сообщений на stderr: «md5sum: somefilename: нет такого файла или каталога». Интересно, есть ли способ подавить это? gojira 10 лет назад 0
@gojira Если вы получили «нет такого файла или каталога», вероятно, потому что файлы содержат пробелы, и команда brixenDK прерывает это (из-за `for f in…`). Например, если бы один файл назывался `foo bar`, он попытался бы получить сумму MD5 для` foo` и `bar`, которые оба не существуют. Для хорошего объяснения, почему это происходит и как этого избежать, см .: http://mywiki.wooledge.org/ParsingLs slhck 10 лет назад 1