Я знаю, что могу сделать

find . -name '*.pyc' -delete

Но когда я ищу определенные каталоги, -delete не сообщает о том, что каталоги не пусты.

Можно ли заставить find удалить непустые каталоги? Я не хочу использовать -exec rm -rf '{}' потому что это кажется мне более подверженным ошибкам.

1 ответ1

1
find . \( -name '*.pyc' -o -path '*.pyc/*' \) -delete

Если каталог соответствует -name '*.pyc' тогда все внутри соответствует -path '*.pyc/*' . И наоборот: если что-то соответствует -path '*.pyc/*' то есть каталог, который соответствует -name '*.pyc' где - то над ним. Мы используем логическое ИЛИ (-o) для удаления объектов любого вида.

Заметки:

  • Вам нужна скобка из - за этого: Почему find в Linux пропустить ожидаемые результаты , когда -o используются?
  • -delete подразумевает -depth , поэтому объекты удаляются в правильном порядке.
  • Предупреждение: find . … должно хорошо работать, но find path … не может. Рассматривать

    find /mnt/a.pyc/foo/ \( -name '*.pyc' -o -path '*.pyc/*' \) -delete
    

    -path '*.pyc/*' будет соответствовать всему, в то время как -name '*.pyc' может ничего не соответствовать. В этом случае команда удалит больше, чем вы ожидаете.

  • -delete не требуется POSIX. Портативное решение требует -exec rm … или xargs . Я не знаю, что вы имеете в виду под "более склонным к ошибкам". Ваш -exec rm -rf '{}' выглядит почти нормально. После добавления -- мне кажется, что все в порядке:

    find . -name '*.pyc' -prune -exec rm -rf -- {} +
    

    Я использовал -prune чтобы избежать этого сценария: Удалить файлы и каталоги по их именам.Нет такого файла или каталога.

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