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

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

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

Любая помощь была бы очень кстати.

Вы можете пройти 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 themcron: OKdatabase.sqlite3: OKfabfile.py: OKfabfile.pyc: OKmanage.py: OKnginx.conf: OKuwsgi.ini: OK

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

find -type f -exec md5sum "{}" + > checklist.chk

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

  • Он может создавать файлы, совместимые с SFV, и проверять их тоже.

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

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

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

    rhash --md5 -p '%h,%p\n' -r /home/ > checklist.csv

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

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

Обратите внимание, что вы также можете изменить md5sum с rhash в Примеры PhoenixNL72.

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

  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.

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

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

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

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

Вот мой:

time find dirname/|xargs md5sum |tee dirname.md5

Он выдает ошибки, когда пытается вычислить его для каталога, но для меня этого достаточно.

найди . -введите f -exec md5sum {} > md5sums.txt \;
это все, что вам нужно!

Or rather: find . -type f -exec md5sum {} > {}.md5sum \;