Этот подход должен работать:
cd /path1
find . -type f -exec cmp -s {} /path2/{} \; -delete
Как это устроено:
find . -type f
просматривает все файлы в текущем каталоге (A) и его подкаталогах.
cmp -s {} /path2/{}
молча (-s
) сравнивает текущий обработанный файл ({}
) с соответствующим файлом в B (/path2/{}
).
Если файлы идентичны, cmp возвращает true и условие -exec
совпадает.
Если условие -exec
совпадает, -delete
удаляет файл.
Я предлагаю заменить -delete
на -print
перед запуском фактической команды, чтобы проверить, работает ли она должным образом.
Чтобы справиться с оставшимися пустыми каталогами, вы можете выполнить команду:
find . -type d -exec rmdir -p {} \; 2> /dev/null
-type d
находит только каталоги.
-exec rmdir -p {} \;
выполняет rmdir -p {}
для каждого найденного каталога.
{}
- это каталог, который был найден, и ключ -p
заставляет rmdir также удалить свои пустые родительские каталоги.
2> /dev/null
подавляет сообщения об ошибках, возникающие при попытке удалить непустые или ранее удаленные каталоги.
Поскольку rmdir не может удалять непустые каталоги, это должен быть самый безопасный способ.