На моем компьютере, когда я использую:
find . \( -name dirname -type d \) -exec rm -r '{}' ';'
Каталоги удалены, но я получаю ошибку:
find: ‘./dirname’: No such file or directory
для каждого каталога.
Мои каталоги не пусты, поэтому опция -delete для меня не сработает. Я нашел причину такого поведения здесь :
- find берет (не обязательно) первую запись в каталоге ./. это будет, например, dir.1 /
- он сравнивает его с шаблоном «dir.?». это совпадает? да.
- find выполняет "rm -r dir.1".
- find пытается ввести dir.1 /, чтобы найти шаблон в каталоге. он ничего не знает о команде exec.
- он не находит dir.1 / больше. возвращает ENOENT (посмотрите на вывод strace)
Я использовал это вместо этого, чтобы обойти:
rm -r `find . -name dirname -type d`
Имейте в виду, что find по-прежнему будет пытаться перейти в каталоги с именем dirname, что на самом деле не является необходимым и займет некоторое дополнительное время. В зависимости от структуры вашего каталога, вы можете обойти это с помощью --depth
опции поиска. Кроме того, если у вас есть структура каталогов, такая как dirname / foo / dirname, вы получите сообщение об ошибке «Нет такого файла или каталога» от rm. Чтобы подавить ошибки, вы можете перенаправить stderr в / dev / null или использовать -f
флаг (force) с rm.
-delete
опция.