Разница между двумя каталогами и оставить только неизмененные

Мне нужно различать две директории:

 A: /path1/
 B: /path2/
  1. Каталог A содержит все файлы и подкаталоги, которые также содержатся в B.
  2. Файлы в A (и в его подкаталогах) могут иметь различное содержимое эквивалентных файлов в B.
  3. В каталоге 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 не может удалять непустые каталоги, это должен быть самый безопасный способ.

Другие вопросы по тегам