Генерировать контрольную сумму md5 для всех файлов в каталоге

60

Я хотел бы создать список контрольных сумм md5 для всех файлов в каталоге.

Я хочу cat filename | md5sum > ouptput.txt . Я хочу сделать это в 1 шаг для всех файлов в моем каталоге.

Любая помощь будет отличной.     

задан Walter Wayne Leutwyler 10.07.2013 в 16:24
источник

3 ответа

91

Вы можете передать md5sum нескольких имен файлов или расширений bash:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

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

find -type f -exec md5sum "{}" + > checklist.chk
    
ответ дан Oli 10.07.2013 в 16:28
источник
9

Отличная программа создания / проверки контрольной суммы - это размытие. Он создает даже файлы, совместимые с SFV, и проверяет их тоже.

Он поддерживает md4, md5, sha1, sha512, crc32 и многие другие.

Кроме того, он может выполнять рекурсивное создание (-r), например md5deep или sha1deep.

И последнее, но не менее важное: вы можете форматировать вывод файла контрольной суммы; например:

rhash --md5 -p '%h,%p\n' -r /home/

выводит CSV-файл, включая полный путь файлов, рекурсивно начинающийся с каталога /home .

Я считаю чрезвычайно полезным даже опцию -e переименовывать файлы, вставляя crc32 sum в имя.

Вы можете изменить «md5sum» на «крупицу» в примерах PhoenixNL72.

    
ответ дан Marcolino 27.05.2014 в 11:34
6

Вот еще два обширных примера:

  1. Создайте файл md5 в каждом каталоге, который еще не имеет его, с абсолютными путями:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Создайте файл md5 в каждой папке, которая еще не имеет одного: нет путей, только имена файлов:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Что отличает от 1 до 2, так это то, как файлы представлены в полученном файле md5.

Команды выполняют следующие действия:

  1. Создайте список имен каталогов для текущей папки. (Дерево)
  2. Сортировка списка папок.
  3. Проверьте в каждой директории, если файл @ md5sum.md5 существует. Выход Пропущенный, если он существует, выводит Обработка, если она не существует.
  4. Если файл @ md5Sum.md5 не существует, md5Sum будет генерировать один с контрольной суммой всех файлов в папке. 5) Задайте сгенерированный файл @ md5Sum.md5 только для чтения.

Вывод всего этого скрипта может быть перенаправлен в файл (.....; done > test.log) или подключен к другой программе (например, grep). На выходе будут указаны только те каталоги, в которых они были пропущены и которые были обработаны.

После успешного запуска вы получите файл @ md5Sum.md5 в каждом подкаталоге вашего текущего каталога

Я назвал файл @ md5Sum.md5, поэтому он будет указан в верхней части каталога в общей папке samba.

Проверка всех файлов @ md5Sum.md5 может быть выполнена следующими командами:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Затем вы можете grep checklog.txt с помощью grep -v OK, чтобы получить список всех файлов, которые отличаются.

Чтобы регенерировать @ md5Sum.md5 в определенном каталоге, когда вы, например, изменили или добавили файлы, либо удалите файл @ md5Sum.md5, либо переименуйте его и снова запустите команду генерации.

    
ответ дан PhoenixNL72 31.07.2013 в 19:00