Я хотел бы создать список контрольных сумм md5 для всех файлов в каталоге.
Я хочу cat filename | md5sum > ouptput.txt
. Я хочу сделать это за 1 шаг для всех файлов в моем каталоге.
Любая помощь была бы очень кстати.
Я хотел бы создать список контрольных сумм 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.
Вот два более обширных примера:
Создайте файл 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, чтобы он был указан в верхней части каталога в общей папке 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 \;