Рассчитать контрольную сумму MD5 каталога


29

Я ищу быстрый способ сравнить содержимое каталога. Можно ли сделать md5sum (или эквивалентную контрольную сумму) для всего каталога?

Использование Ubuntu Linux


Вы можете также захотеть использовать diff для сравнения каталогов, которые фактически покажут вам, где каталоги различаются. unixtutorial.org/2008/06/how-to-compare-directories-in-unix
Кибби

@ Kibbee Чтобы предотвратить это, вы должны принять во внимание что-то, кроме содержимого данных каждого файла и того, как именно вы проверяете суммы файлов. Дано: [контрольные суммы] 1. A (Справочник) - Файл1 [ABC] - Файл2 [CBA] 2. B (Справочник) - Файл1 [ABC] - B1 (Справочник) - Файл2 [CBA] 3. C (Справочник) - Файл4 [ABC] - file5 [CBA] 4. D (Каталог) - Файл1 копию [ABC] - Файл2 копию [CBA] Справочник , и Б не являются идентичными , хотя они содержат одни и те же файлы (хотя и в В1 , Файл2 в подкаталог) , По вашему примеру, A и C будут считаться идентичными, потому что
Джейкоб Лайлс

Ответы:


36

Конечно - md5sum directory/*

Если вам нужно что-то более гибкое (например, для рекурсии каталога или сравнения хэшей), попробуйте md5deep.

apt-get install md5deep
md5deep -r directory

Чтобы сравнить структуру каталогов, вы можете дать ей список хешей для сравнения:

md5deep -r -s /directory1 > dir1hashes
md5deep -r -X dir1hashes /directory2

Это выведет все файлы в каталоге 2, которые не соответствуют каталогу 1.

Это не будет показывать файлы, которые были удалены из каталога1 или файлы, которые были добавлены в каталог2.


Не то, что я имел в виду, а то, что я хотел :) Я имел в виду рекурсивно, и получал ОДИН хеш в конце, но я думаю, что это можно сделать с помощью md5deep -l и хэширования самого вывода.
pufferfish

1
Порядок хеширования не согласован, поэтому придется отсортировать вывод перед хешированием
pufferfish

1
Чтобы получить детерминированный порядок, используйте -j0который отключает многопоточность (см. Справочную страницу).
Иоганн

1
@ ShaneMadden ♦ Я установил md5deepс sudo apt-get install md5deepon, Ubuntu 16.04но когда я попытался прочитать man-страницу, это говорит мне, что> Нет ручного ввода для md5deep
Kasun Siyambalapitiya

27

Если вы хотите увидеть разницу (если вообще что-то) между двумя каталогами, лучше всего подойдет rsync.

rsync --archive --dry-run --checksum --verbose /source/directory/ /destination/directory

Это перечислит любые файлы, которые отличаются.


2
diff -qr /source/directory/ /destination/directory/также покажет файлы, которые отличаются.
Конерак

Есть ли способ выполнить побитовое сравнение вместо контрольных сумм? Это может быть быстрее на локальных дисках.
Али

Очень хорошо. Работает, если источник или место назначения также являются удаленной папкой, напримерusername@hostname:/destination/directory
Thalis K.

11

Я думаю, что я ответил на этот вопрос раньше:

find . -xtype f -print0 | xargs -0 sha1sum | cut -b-40 | sort | sha1sum

дает: b1a5b654afee985d5daccd42d41e19b2877d66b1

идея заключается в том, что вы хэшируете все файлы, вырезаете хэши по одному на строку, сортируете их и хешируете, получая один хеш. это не зависит от имен файлов.


5

Приложение cfv весьма полезно, оно не только может проверять и создавать контрольные суммы MD5, но также может выполнять CRC32, sha1, torrent, par, par2.

создать файл контрольной суммы CRC32 для всех файлов в текущем каталоге:

CFV-C

создать файл контрольной суммы MD5 для всех файлов в текущем каталоге:

cfv -C -t md5 -f "текущий каталог.md5sums"

Чтобы создать отдельный файл контрольной суммы для каждого подкаталога:

cfv -C -r

Чтобы создать «супер» файл контрольной суммы, содержащий файлы во всех подкаталогах:

cfv -C -rr

4

Я использовал hashdeep, как объяснено в ответе аскубунту: Проверьте правильность скопированных файлов :

Чтобы вычислить контрольные суммы:

 $ cd <directory1>
 $ hashdeep -rlc md5 . > ~/hashOutput.txt

Чтобы проверить и перечислить различия:

 $ cd <directory2>
 $ hashdeep -ravvl -k ~/hashOutput.txt .
 hashdeep: Audit passed
    Input files examined: 0
   Known files expecting: 0
           Files matched: 13770
 Files partially matched: 0
             Files moved: 0
         New files found: 0
   Known files not found: 0

Это имеет преимущество перед md5deep в том, что оно показывает переименованные (перемещенные), добавленные и удаленные файлы, а также позволяет избежать проблемы с файлами 0 длины, указанными в нижней части http://www.meridiandiscovery.com/how- в / validating-copy-results-using-md5deep .


3

Это сработало для меня: (запустите его в интересующем вас каталоге)

md5deep -rl . | awk '{print $1}' | sort -n | md5sum

1

Вы можете создавать суммы MD5 для каждого отдельного файла, упорядочивать эти контрольные суммы в алфавитном порядке и иметь их (с символами новой строки или без них). Поскольку MD5 криптографичен, он должен прекрасно работать с хэшами хэшей.

Там должен быть определенный порядок вещей, иначе вы получите разные результаты для равных dirs.

И вы должны учитывать , что добавление какого - либо файл в одной директории будет полностью изменить результат, даже если это было только .directoryиз .DS_Storeфайла.


Технически можно получить один и тот же хеш для разных каталогов. Если бы у dir A было 2 файла с содержимым «ab» и «c», а у dir B было 2 файла с содержимым «a» и «bc», то хэширование только данных в файлах дало бы те же результаты, даже если у них есть файлы с разное содержание. Я даже не уверен, как можно определить MD5Sum каталога.
Кибби

1

В качестве конкретного случая предположим, что вы хотите скопировать некоторые файлы из каталога 1 в каталог 2, а затем вы хотите проверить успешное копирование, используя сравнение md5.

Первый. перейдите в каталог directory1 и введите:

find -type f -exec md5sum "{}" \; > ~/Desktop/md5sum.txt

который создаст ссылочный файл, содержащий сумму md5 для каждого файла в directory1. Как только это будет сделано, все, что вам нужно сделать, это перейти в каталог directory2 и набрать:

md5sum -c ~/Desktop/md5sum.txt

Программа md5sum извлекает каждый путь из файла md5sum.txt, вычисляет md5sum этого файла в папке назначения и затем сравнивает его с суммой, которую он сохранил в файле.

После того, как процесс будет завершен, вы получите сводку, такую ​​как «Так много файлов не совпадают» или что-то в этом роде.



1

Мне нужно было проверить целостность резервных копий / зеркал, которые содержат большое количество файлов, и в итоге я написал программу командной строки под названием MassHash. Это написано на Python. GTK + Launcher также доступна. Вы можете проверить это ...

http://code.google.com/p/masshash/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.