Данный:
EmptyMe
на разных уровняхEmptyMe
каталоги содержат подкаталоги и файлыТребуемый:
EmptyMe
каталоги (включая их подкаталоги), при хранении тех каталогов (не удаляющий их).Вопрос:
Что команда Unix должна рекурсивно найти всеми EmptyMe
каталоги от текущего уровня и удаляют все свое содержание (включая подкаталоги) при хранении EmptyMe
каталоги на диске?
Моя попытка:
$ find . -name 'EmptyMe' -type d -exec rm -- {} +
rm: cannot remove `./a/b/c/d/EmptyMe': Is a directory
Как Вы видите, та команда попыталась удалить EmptyMe
, в противоположность его содержанию.
Тестовый прогон:
find . -path '*/EmptyMe/*'
Реальное удаление:
find . -path '*/EmptyMe/*' -delete
-path '*/EmptyMe/*'
средства соответствуют всем объектам, которые находятся в названном каталоге EmptyMe
.
Один из вариантов, который можно использовать, это вкладывать команды:
find . -type d -name 'EmptyMe' -exec find {} -mindepth 1 -delete \;
Внешний find -type d -name 'EmptyMe'
находит необходимые каталоги и запускает внутреннюю команду find
через -exec ... \;
. Внутренняя команда спускается в найденный каталог (на который ссылается {}
), и поскольку мы используем здесь флаг -delete
, она должна следовать за поиском в глубину, удалением файлов и затем подкаталогами.
Это работает, но выдает ошибки, если каталоги EmptyMe
пусты.
find . -name 'EmptyMe' -type d -exec sh -c 'rm -r -- "$1"/*' sh {} \;
Пример ошибки:
rm: cannot remove ‘./EmptyMe/*’: No such file or directory