Разница между двумя каталогами и оставить только неизмененные
Мне нужно различать две директории:
A: /path1/
B: /path2/
- Каталог A содержит все файлы и подкаталоги, которые также содержатся в B.
- Файлы в A (и в его подкаталогах) могут иметь различное содержимое эквивалентных файлов в B.
- В каталоге A (и его подкаталогах) также есть дополнительные файлы, которых нет в B.
Чего я хотел бы достичь:
- Сохраняйте только те файлы в A, которые отличаются от файлов в B, плюс все дополнительные файлы, которых нет в B.
- Удалите все остальные файлы в A, которые не соответствуют предыдущему правилу.
1 ответ
Этот подход должен работать:
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 {}для каждого каталога, который был найден.{}каталог, который был найден, и-pswitch заставляет rmdir также удалять свои пустые родительские каталоги.2> /dev/nullподавляет сообщения об ошибках, которые возникают при попытке удаления непустых или ранее удаленных каталогов.
Поскольку rmdir не может удалять непустые каталоги, это должен быть самый безопасный способ.