Я хотел бы создать список контрольных сумм md5 для всех файлов в каталоге.
Я хочу cat filename | md5sum > ouptput.txt
. Я хочу сделать это за 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
Создайте файл 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.
Команды выполняют следующее:
Вывод всего этого скрипта может быть перенаправлен в файл (.....; done> test.log) или передан в другую программу (например, grep). Выходные данные только скажут вам, какие каталоги были пропущены, а какие обработаны.
После успешного запуска вы получите файл @ md5Sum.md5 в каждом подкаталоге вашего текущего каталога
Я назвал файл @ md5Sum.md5, так что он будет указан в верхней части каталог в общей папке самбы.
Проверка всех файлов @ 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.
Вы можете передать 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
Отличная программа для создания / проверки контрольных сумм - это 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.
Я поразил эту проблему, и в то время как решения выше изящны, я хотел быстрый и грязный взлом для этой ситуации: 1 каталог, с подкаталогами один уровень глубоко в нем.
Так, введите каталог в оболочку и работайте:
md5sum * */* 2>/dev/null > md5sum.md5
Это получает все файлы в высокоуровневом каталоге, удаляет ошибку при предупреждении о подкаталогах быть каталогами и затем выполняет md5sums на содержании подкаталога. Преимущество: легкий помнить, делает точно, что это, как предполагается, делает. Я всегда запутываюсь синтаксисом находки и никогда не могу помнить это первое, что пришло на ум, таким образом, никакая потребность циклично выполниться и т.д., имея дело с пробелами в именах каталогов, этот лайнер хорошо работал. Не устойчивое мощное решение, отрицательный результат для> 1 уровень подкаталогов, но быстрая и легкая фиксация для проблемы.
Вот мой:
time find dirname/|xargs md5sum |tee dirname.md5
Он выдает ошибки, когда пытается вычислить его для каталога, но для меня этого достаточно.