Створіть контрольну суму 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 '{}'` Мені вдалося його отримати. Дякую :)
Kasun Siyambalapitiya

Я більше віддаю перевагу вигляду цього виходу:openssl md5 * > checklist.txt
Ешлі

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.


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

Після цього ви можете скопіювати checklog.txt за допомогою grep -v ОК, щоб отримати список усіх файлів, які відрізняються.

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


Команда №1 з використанням повних контурів: md5sum "$ {dir}" / * не збирає приховані файли, починаючи з крапки. Будь-який засіб?
користувач14654

Пізно до партії, але оскільки md5sum хоче імена файлів (здається, ухаппі, якщо ви дасте йому каталог), можливо, найпростіше буде попросити знайти допомогу: $ md5sum $ (знайдіть "$ dir" -maxdepth 0 -тип f) "- тип f "витягує звичайні та .hidden файли (також, у пошуку є багато варіантів, але може бути дуже корисним). Пропустіть частину "-maxdepth 0", якщо ви хочете, щоб все було рекурсивно. Зауважте: це крихко, якщо в назви файлів є вбудовані пробіли, тоді ви можете прочитати на xargs та -0 ( en.wikipedia.org/wiki/Xargs )
jgreve

0

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

Отже, введіть каталог в оболонку і запустіть:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.