Разница между двумя каталогами и оставить только неизмененные
Мне нужно различать две директории:
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 {}
для каждого каталога, который был найден.{}
каталог, который был найден, и-p
switch заставляет rmdir также удалять свои пустые родительские каталоги.2> /dev/null
подавляет сообщения об ошибках, которые возникают при попытке удаления непустых или ранее удаленных каталогов.
Поскольку rmdir не может удалять непустые каталоги, это должен быть самый безопасный способ.