Хороший спосіб зробити це порівняння - використовувати find
з md5sum
, потім a diff
.
Приклад
Використовуйте пошук, щоб перерахувати всі файли в каталозі, а потім обчислити хеш md5 для кожного файлу та передати його сортування за назвою файлу у файл:
find /dir1/ -type f -exec md5sum {} + | sort -k 2 > dir1.txt
Зробіть ту ж процедуру в іншому каталозі:
find /dir2/ -type f -exec md5sum {} + | sort -k 2 > dir2.txt
Потім порівняйте результат два файли з diff
:
diff -u dir1.txt dir2.txt
Або як одна команда, що використовує підстановку процесу:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2) <(find /dir2/ -type f -exec md5sum {} + | sort -k 2)
Якщо ви хочете бачити лише зміни:
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ") <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | cut -f1 -d" ")
Команда cut виводить тільки хеш (перше поле), яке порівнюється по diff. В іншому випадку diff буде друкувати кожен рядок, оскільки шляхи до каталогу відрізняються, навіть якщо хеш однаковий.
Але ви не знатимете, який файл змінився ...
Для цього можна спробувати щось подібне
diff <(find /dir1/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /') <(find /dir2/ -type f -exec md5sum {} + | sort -k 2 | sed 's/ .*\// /')
Ця стратегія дуже корисна, коли два каталоги, які потрібно порівнювати, не знаходяться в одній машині, і вам потрібно переконатися, що файли в обох каталогах рівні.
Ще один хороший спосіб виконати роботу - це використання diff
команди Git (може спричинити проблеми, коли файли мають різні дозволи -> кожен файл перерахований у висновку тоді):
git diff --no-index dir1/ dir2/
bash --version
?