На этот вопрос уже есть ответ:
Основной_директория включает 0001 0102 0203 ... подкаталоги. Подкаталоги включают множество каталогов. Мне нужно удалить все подкаталоги, кроме нескольких, например, с именами «abc», «bcd» и «123».
Как выполнить эту обработку удаления с помощью команды?
shopt extglob # possibly already there
shopt globstar # not often the default
rmdir ./**/!(abc|def) # rinse and repeat
В slo-mo:
extglob
включает расширенные шаблоны удара (включая вещи как !(abc|def)
это означает (что-либо, но abc
илиdef
)globstar
делает **
соответствуйте любому уровню каталогов./**/!(abc|def)
будет соответствовать всему не названному abc
или def
(Я предполагаю, что Вы уже удалили файлы, иначе с немного отличающимся шаблоном, Вы можете rm
файлы также [*]) rmdir
поскольку верхние уровни прибудут, прежде чем более низкие уровни удалены, который является, почему Вам, вероятно, придется повторить команду несколько раз.find
Можно также использовать find
(с -depth
обработать подкаталоги сначала):
find . -depth -type d \( \! -name 'abc' -a \! -name 'def' \) -exec rmdir {} \;
но поскольку Вы видите, что команда будет довольно подробной, если у Вас будет больше чем несколько каталогов для игнорирования.
[*] rm ./**/!(abc|def)/*.txt
например,
Я думаю, что Ваш наилучший вариант состоит в том, чтобы использовать find
Я полагаю, что эта команда сделает то, что Вы хотите.
find /path/to/dir/ -not -path "*/abc*" -not -path "*/bcd*" -not -path "*/123*" -type f -delete
Но я предложил бы выполнить его без -delete
или type f -delete
сначала так, чтобы Вы видите то, что удаляется. Или даже выполненный это на наборе тестов каталогов для проверки это делает то, что Вы думаете, что это прежде выполняет его на Ваших важных файлах.
Для получения дополнительной информации об этом и других методах о том, как сделать это использование find
посмотрите следующий вопрос https://unix.stackexchange.com/questions/87258/delete-all-files-except-in-a-certain-subdirectory-with-find
Править:
Разрешать некоторый беспорядок об использовании -type f
вместо -type d
, при попытке его, Вы будете видеть, что это на самом деле делает то, что спрашивает OP. -type d
отметьте на самом деле приводит к порядку файлов и каталогов, перечисляемых в другом порядке. Как таковой delete
попытки удалить каталог перед файлом в каталоге были удалены (который не позволяется сделать). Таким образом использовать -type d
флаг порядок перечисленных файлов должен был бы быть инвертирован, который возможен, но также и походил на ненужный шаг как type -f
отметьте на самом деле работает, удаляя и файлы и каталоги.