5

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

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

То, что я хотел бы достичь, это:

  • Сохраняйте только файлы в A, которые отличаются от файлов в B, плюс все дополнительные файлы, которых нет в B.
  • Удалите все остальные файлы в A, которые не соответствуют предыдущему правилу.

1 ответ1

6

Этот подход должен работать:

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 не может удалять непустые каталоги, это должен быть самый безопасный способ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .