Как md5 список путей к файлам, содержащимся в файле?

У меня есть папка, содержащая много папок, содержащих много файлов. Тысячи.

Я могу find . -type f > ./FILE-LISTING.TXTсоздать файл, содержащий многие тысячи путей к файлам, который выглядит так:

./Anders/Letters/20190101 Rent.pdf
./Anders/Letters/20190103 Appeal.pdf
./Anders/Letters/20190107 Decision.pdf
./Beeker/Letters/20180101 Rent.pdf

Как бы я передал этот список путей к файлам, md5чтобы получить вывод, отформатированный следующим образом:

9cf14e4d666dcb6aab17763b02429a19 ./Anders/Letters/20190101 Rent.pdf
d1bb70baa31f1df69628c00632b65eab ./Anders/Letters/20190103 Appeal.pdf
7a0f5bc18688fe8ba32f43aa6ec53fb1 ./Anders/Letters/20190107 Decision.pdf
a0c96a79cf3b1847025d9f073151519d ./Beeker/Letters/20180101 Rent.pdf

NB: мне нужны хэши md5 ссылочных файлов, а не md5 списка файлов или хэши md5 строк в файле-listing.txt.

Кроме того, будет ли быстрее сделать все это в одной командной строке или в два прохода (создать findфайл-листинг.txt, а затем md5создать файл-листинг-md5.txt)?

Это превосходный вопрос — ясный, ставит несколько проблем, но будет очень выполнимым, поскольку каждый инструмент для автоматизации в MacOS должен обрабатывать пробелы в именах файлов, циклы и переменные для обработки изменяющегося обрабатываемого файла. Молодцы — надеюсь, мы получим отличные ответы на python, bash, swift и других вариантах написания сценариев.
Каков ваш вариант использования этого файла? mtree— это уже доступный инструмент для мониторинга хэшей файлов и обнаружения изменений в именах файлов, содержимом файлов, разрешениях или метках дат. man mtreeдля деталей.mtree -c -K md5digest
Вариант использования заключается в передаче файла хэшей и путей к файлам сторонней СУБД, которая отслеживает множество дополнительных деталей, отсутствующих в файловой системе. Если файлы перемещаются, их можно повторно связать. Если файл редактируется на месте, его можно повторно связать.

Ответы (2)

find . -type f -exec /sbin/md5 -r {} +
       ^^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^ ^
          |      |        |       |  |
          |      |        |       |  +- add as many file names as possible per call
          |      |        |       +---- replace with names of found files
          |      |        +------------ command to run
          |      +--------------------- execute following command
          +---------------------------- find any "normal" file

должен помочь (и позаботиться об обычных проблемах с пробелами и т. д. в именах файлов).

Насчет быстрее: один проход почти всегда быстрее, чем два прохода. В конкретном случае расчет MD5 занимает так много времени, что другие факторы, скорее всего, можно не учитывать.

PS: Передаю шляпу @lhf за то, что напомнил мне о-r

И @nohillside, и @lhf дали хорошие, достоверные ответы. По прихоти я решил посмотреть, существенно ли один лучше другого. Я запускал оба в каталоге, содержащем более 64 000 файлов в формате time. Версия find -execбыла примерно на 3 секунды быстрее, чем find | xargs. Однако время выполнения для обоих было около 45 секунд, что означает, что (а) разница составляет менее 10% и (б) время, вероятно, связано с вводом-выводом (вывод на консоль).
Это почти наверняка связано с вводом-выводом (но не для печати на консоль, он должен переварить все эти файлы, это займет время)
@CraigS.Cottingham Файлов примерно столько же, но они находятся в глубоко вложенных каталогах, а не только в одном каталоге, что может объяснить, почему унаследованная мной командная строка выполняется примерно 15 минут . В следующий раз, когда буду на сайте, тоже сравню.
@Erics Простые команды поиска (как и та, что у вас есть в вопросе) связаны исключительно с вводом-выводом. При вычислении хэшей MD5 это может быть как ввод-вывод (для чтения всех данных), так и ЦП (для вычисления хэша), но это зависит от используемого оборудования.

Попробуй это:

find . -type f -print0 | xargs -0 md5 -r

Обратите внимание -print0и -0для обработки пробелов в именах файлов.

По сравнению с find . -type f -exec, это решение запускается md5намного реже, хотя это может не иметь заметного влияния.

findтакже может -exec {}обрабатывать пробелы в именах файлов.
И @nohillside, и @lhf дали хорошие, достоверные ответы. По прихоти я решил посмотреть, существенно ли один лучше другого. Я запускал оба в каталоге, содержащем более 64 000 файлов в формате time. Версия find -execбыла примерно на 3 секунды быстрее, чем find | xargs. Однако время выполнения для обоих было около 45 секунд, что означает, что (а) разница составляет менее 10% и (б) время, вероятно, связано с вводом-выводом (вывод на консоль).
Какую оболочку вы используете?
@ fd0, я использую bash.