Хороший способ сделать это сравнение - использовать find
с md5sum
, а затем diff
.
пример
Используйте find, чтобы вывести список всех файлов в каталоге, затем вычислить хэш 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
?