Как я могу рекурсивно найти каталог по имени и удалить его содержание (включая все подкаталоги и файлы) при хранении самого каталога?

Данный:

  1. У меня есть древовидная структура с папками EmptyMe на разных уровнях
  2. EmptyMe каталоги содержат подкаталоги и файлы

Требуемый:

  1. Пустое содержание EmptyMe каталоги (включая их подкаталоги), при хранении тех каталогов (не удаляющий их).

Вопрос:

Что команда Unix должна рекурсивно найти всеми EmptyMe каталоги от текущего уровня и удаляют все свое содержание (включая подкаталоги) при хранении EmptyMe каталоги на диске?

Моя попытка:

$ find . -name 'EmptyMe' -type d -exec rm -- {} +
rm: cannot remove `./a/b/c/d/EmptyMe': Is a directory

Как Вы видите, та команда попыталась удалить EmptyMe, в противоположность его содержанию.

7
задан 9 September 2019 в 03:49

3 ответа

Тестовый прогон:

find . -path '*/EmptyMe/*'

Реальное удаление:

find . -path '*/EmptyMe/*' -delete

-path '*/EmptyMe/*' средства соответствуют всем объектам, которые находятся в названном каталоге EmptyMe.

9
ответ дан 23 November 2019 в 06:20

Один из вариантов, который можно использовать, это вкладывать команды:

find . -type d -name 'EmptyMe'  -exec find {} -mindepth 1 -delete \;

Внешний find -type d -name 'EmptyMe' находит необходимые каталоги и запускает внутреннюю команду find через -exec ... \;. Внутренняя команда спускается в найденный каталог (на который ссылается {}), и поскольку мы используем здесь флаг -delete, она должна следовать за поиском в глубину, удалением файлов и затем подкаталогами.

3
ответ дан 23 November 2019 в 06:20

Это работает, но выдает ошибки, если каталоги EmptyMe пусты.

find . -name 'EmptyMe' -type d -exec sh -c 'rm -r -- "$1"/*' sh {} \;

Пример ошибки:

rm: cannot remove ‘./EmptyMe/*’: No such file or directory
0
ответ дан 23 November 2019 в 06:20

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

Похожие вопросы: