Чи є MD5 (або подібний) до папки? Як перевірити, чи однакові дві папки?


10

Я хотів би знайти md5sum(або подібний розрахунок) папки, не стискаючи її в архів.

Наприклад, якщо в папці MyFolderє файли 1.txt, 2.txtі 3.txt, що містять:


1.txt

Текст у 1.txt

2.txt

Текст у 2.txt

3.txt

Текст у 3.txt


Як я можу обчислити md5sumціле ціле MyFolder? Чи є спосіб? Я хочу використовувати це для перевірки наявності двох папок однакового вмісту.

Це може бути утилітою для перевірки рівності двох компакт-дисків чи папок. Мені б хотілося простий спосіб зробити це.

Відповіді:


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 Thx a lot.
GarouDan

@GarouDan. Команда, яку ви показали, буде переходити до символічних посилань. Ви можете використовувати -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)

Пам'ятайте, що ви можете скористатися цим.


Це цікавий момент. У цьому списку перераховані всі файли кожної папки ... але якщо у мене дійсно велика кількість архівів ... як я можу перевірити, чи є в одній папці однакові файли (з даними - можливо, використовуючи інструмент md5sum)?
GarouDan

1
Потім зробіть різницю виводу MD5SUM кожного файлу. Вам просто потрібно з’єднати команди find, md5sum і diff по-різному.
sybreon

Думаю і про ваші ідеї, cya ... Я спробую цікаві речі з цим знайти comand після ... спасибі.
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}. Це повинно працювати в більшості випадків (воно принаймні перевіряє кількість файлів у dir та його підкаталогах).


Це хороший сценарій ... thx @Chris. Але у нього є проблема ... використання кота , підпапок збивається з помилками ... У вас є ідея вирішити це? Thx багато.
GarouDan

Це прекрасно працює для мене. Переконайтеся, що ваша оболонка підтримує globstar. Що таке помилка?
Кріс Даун

1
Він "працює" (+1) ... але globstar у bash 4 слід посилань на каталоги , але це лише проблема, якщо будь-який каталог містить симпосилання.
Пітер.О

@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, використовуйте, >а не>>

Зауважте, що ця команда може зайняти досить багато часу, залежно від швидкості io та розміру даних. Ви можете експериментувати з nice та / або ionice, щоб підвищити продуктивність md5deep, але це не виходить за рамки цієї відповіді.

Коли створення контрольних сум закінчено, тепер у вас є файл із записами, схожими на:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d/anacron 50d89784c1e201f68ff978b95ff4bdfb ./oldconfig-11-09-2013 /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, залежно від дозволів файлів, якими ви обробляєте.


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