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

75

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

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

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

Уолтер Уэйн Лейтвайлер
источник
Как я могу найти md5sum (контрольную сумму) определенного файла резервной копии? -Как должен выглядеть мой сценарий

Ответы:

110

Вы можете передать 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
Оли
источник
1
♦ как использовать вышеперечисленное для получения md5sumфайлов внутри подкаталогов, при этом вышеприведенные данные md5sum *переходят на уровень подкаталогов, говоря ... это каталог
Kasun Siyambalapitiya
Извините за вопрос, запустив find -type f -exec md5sum '{}' +команду `find -type f -exec md5sum '{}'` Я смог ее получить. Спасибо :)
Касун Сиямбалапития
Я предпочитаю внешний вид этого вывода подробнее:openssl md5 * > checklist.txt
Ashley
1
Если вы используете оболочку, которая с удовольствием **рекурсивно оценивает (например, zsh), это еще проще:md5sum **/* 2>/dev/null
Joost
12

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

Он поддерживает MD4, MD5, Sha1, Sha512, CRC32 и многие другие.

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

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

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

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

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

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

Marcolino
источник
1
Что именно делает «/ home /» здесь? Этот инструмент выглядит довольно хорошо.
Энди
Я думаю, что это ошибка, это, безусловно, ошибки для меня. -P это формат для вывода. Я исправлю это.
pbhj
7

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

  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, либо переименуйте его и снова введите команду generate.

PhoenixNL72
источник
Команда # 1, использующая полные пути: md5sum "$ {dir}" / * не собирает скрытые файлы, начинающиеся с точки. Любое средство?
user14654
Поздно до вечеринки, но поскольку md5sum хочет получить имена файлов (кажется, что вы недовольны, если вы дадите ему каталог), может быть проще всего обратиться за помощью: $ md5sum $ (find "$ dir" -maxdepth 0 -type f) The "- Тип f "извлекает обычные и скрытые файлы (также, у find есть много опций, но это может быть очень полезно). Опустите часть "-maxdepth 0", если вы хотите все рекурсивно. Примечание: это хрупко, если имена файлов имеют встроенные пробелы, тогда вы можете прочитать о xargs и -0 ( en.wikipedia.org/wiki/Xargs )
jgreve
0

Я столкнулся с этой проблемой, и хотя приведенные выше решения изящны, я хотел быстро и грязно взломать эту ситуацию: 1 каталог с подкаталогами на один уровень внутри него.

Итак, введите каталог в оболочке и запустите:

md5sum * */* 2>/dev/null > md5sum.md5

Он получает все файлы в каталоге верхнего уровня, удаляет предупреждение об ошибке о том, что подкаталоги являются каталогами, а затем запускает md5sums для содержимого подкаталога. Преимущество: легко запомнить, делает именно то, что должен. Меня всегда смущает поиск синтаксиса, и я никогда не могу вспомнить его изо всех сил, поэтому не нужно зацикливаться и т. Д., Имея дело с пробелами в именах каталогов, этот один вкладыш работал нормально. Не надежное мощное решение, не подходящее для> 1 уровня подкаталогов, но быстрое и простое решение проблемы.

Lizardx
источник