Есть ли в папке MD5 (или аналог)? Как проверить, равны ли две папки?

10

Я хотел бы найти md5sum(или аналогичный расчет) папки, не сжимая ее в архив.

Например, если в папке MyFolderу нас есть файлы 1.txt, 2.txtи 3.txt, содержащие:


1.txt

Текст в 1.txt

2.txt

Текст в 2.txt

3.txt

Текст в 3.txt


Как я могу рассчитать все md5sumэто MyFolder? Есть ли способ? Я хочу использовать это, чтобы проверить, имеют ли две папки одинаковое содержимое.

Это может быть использовано, чтобы проверить, равны ли два диска или папки. Я хотел бы простой способ сделать это.

GarouDan
источник

Ответы:

15

Инструмент md5deep был разработан именно для этой цели. Многие дистрибутивы Linux предлагают его в виде пакета.

Дэвид Шварц
источник
1
Спасибо! Это работало нормально для меня. Другим пользователям с той же проблемой нравится это: sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory спасибо большое.
GarouDan
@GarouDan. Команда, которую вы показали, будет следовать символическим ссылкам. Вы можете использовать -oопцию для обработки типов файлов.
Peter.O
О боже ... не знаю, что ... действительно полезно. Я запомню!
GarouDan
4

Если вы не хотите архивировать это, возможно, вы могли бы сделать что-то вроде этого

diff <(find folder1) <(find folder2)

Возможно, вам придется адаптировать findкоманды, чтобы быть более точным.

РЕДАКТИРОВАТЬ Вы можете добавить -execк вашему поисковому вызову, чтобы сравнить содержимое файлов. Что-то похожее на это:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Помните, что вы можете адаптировать это.

rahmu
источник
Это интересный момент. В этом списке перечислены все файлы каждой папки ... но если у меня действительно большое количество архивов ... как проверить, есть ли в каждой папке одни и те же файлы (с данными - может быть, с помощью инструмента md5sum)?
GarouDan
1
Затем выполните различие вывода MD5SUM каждого файла. Вам просто нужно по-разному объединить команды find, md5sum и diff.
Sybreon
Спасибо за ваши идеи тоже, cya ... Я постараюсь интересные вещи с этими найти команду после ... спасибо.
GarouDan
3

Одним из способов проверки может быть создание md5sum на основе объединения всех файлов в папке и ее подпапках. Помните, что для этого также необходимо, чтобы файлы имели одинаковые имена (так как они должны быть в одинаковом порядке сортировки). Следующий код должен работать:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Если вы действительно заботитесь об именах файлов и т. Д., Вы можете использовать цикл для сравнения содержимого ${_files_in_old_dir}и ${_files_in_new_dir}. Это должно работать в большинстве случаев (по крайней мере, проверяет количество файлов в каталоге и его подкаталогах).

Крис Даун
источник
Это хороший сценарий ... спасибо @Chris. Но у него есть проблема ... при использовании cat подпапки вылетают с ошибками ... У вас есть идея, чтобы решить эту проблему? Большое спасибо.
GarouDan
Он отлично работает для меня. Убедитесь, что ваша оболочка поддерживает globstar. В чем ошибка?
Крис Даун
1
Это «работает» (+1) ... но globstar в bash 4 следует символическим ссылкам на каталоги , но это проблема, только если любой каталог содержит символическую ссылку.
Peter.O
@fered Хороший звонок, добавил я в тесте.
Крис Даун
0

Я заметил, что оригинальный пост довольно старый, однако, я думаю, что эта информация все еще может быть полезна для тех, кто ищет решение для проверки правильности копирования файлов. Rsync может быть лучшим методом для копирования данных, и ответы, приведенные в этой теме, хороши, однако для тех, кто не знаком с Linux, я попытаюсь дать более подробное объяснение.

Сценарий: вы просто скопировали данные с диска на другой, с большим количеством подкаталогов и файлов. Вы хотите убедиться, что все данные скопированы правильно.

Сначала убедитесь, что md5deep установлен, введя команду md5deep -v.

Если вы получаете сообщение, в котором говорится что-то вроде «команда не найдена», то установите md5deep by apt-get install md5deep.

Предполагается, что вы хотите иметь дело только с обычными файлами. Если вы хотите работать с другими типами файлов, обратитесь к флажку -o в руководстве по md5deep. ( man md5deep)

Теперь все готово, и мы предполагаем, что вы скопировали файлы из /mnt/orginalв /mnt/backup, заменив их на любые каталоги, которые вы используете.

Сначала перейдите в исходный каталог, это исходный источник для файлов, которые вы скопировали или скопировали:

cd /mnt/orginal

Затем создайте контрольную сумму каждого файла:

md5deep -rel -o f . >> /tmp/checksums.md5

Эта команда объяснила:

-r включает рекурсивный режим

-e отображает индикатор прогресса

-l включает относительные пути к файлам.

-o f работать только на обычных файлах (не блочных устройствах, именованных каналах и т. д.)

. говорит md5deep запускаться в текущем каталоге.

>> /tmp/checksums.md5говорит md5deep перенаправить весь вывод /tmp/checksums.md5.

Обратите внимание, если вы хотите перезаписать содержимое в предыдущих версиях /tmp/checksums.md5, используйте, >а не>>

Обратите внимание, что эта команда может занять довольно много времени, в зависимости от скорости ввода-вывода и размера данных. Вы можете поэкспериментировать с nice и / или ionice, чтобы увеличить производительность md5deep, но это выходит за рамки этого ответа.

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

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm-09fb0bdbdfd5fd6f5df4bd4fd4fd4fd4fd4fd4ef4 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

Первый столбец - контрольная сумма md5, а второй столбец - относительный путь к файлу, к которому принадлежит контрольная сумма.

Если вы хотите увидеть, сколько файлов существует в файле контрольной суммы, введите команду:

wc /tmp/checksums.md5 -l

Теперь вы хотите проверить правильность скопированных данных:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

Единственное отличие от того, когда мы создали контрольные суммы, - это -X, который отображает текущий хэш файла, если запись в файле checkums.md5 не совпадает. Таким образом, к концу теста, если /tmp/compare.resultон пуст, вы можете быть уверены, что все файлы скопированы правильно, поскольку контрольные суммы совпадают.

Обратите внимание, что только файлы, перечисленные в /tmp/checksums.md5файле, будут проверены на правильность контрольной суммы. Если в /mnt/backupкаталоге есть какие-либо дополнительные файлы , md5deep не уведомит вас об этом.

Заметки:

  • Вам не обязательно использовать перенаправление для хранения выходных файлов. Обратитесь к руководству md5deep для получения дополнительной информации.

  • Возможно, вам придется запускать команды md5deep от имени пользователя root, в зависимости от прав доступа к файлам, с которыми вы работаете.

NordicViking
источник
0

Если вы хотите рекурсивно проверить различия между двумя каталогами /path1и /path2 без использования md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Объяснение:

  • получить, path1чтобы все строки были напечатаны findотносительно path1( cd /path1)
  • перечисляет все файлы рекурсивно в текущем пути ( && find . -type f)
  • использовать каждую строку вывода findкак вход для md5( | xargs md5)

Вывод будет выглядеть так, если они будут отличаться:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
david_p
источник