рекурсивно удалить все подкаталоги, кроме нескольких [дубликат]

Основной_директория включает 0001 0102 0203 ... подкаталоги. Подкаталоги включают множество каталогов. Мне нужно удалить все подкаталоги, кроме нескольких, например, с именами «abc», «bcd» и «123».

Как выполнить эту обработку удаления с помощью команды?

0
задан 19 September 2018 в 07:28

2 ответа

Быстрый и грязный, но очень эффективный:

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 например,

3
ответ дан 27 October 2019 в 10:45

Я думаю, что Ваш наилучший вариант состоит в том, чтобы использовать 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 отметьте на самом деле работает, удаляя и файлы и каталоги.

0
ответ дан 27 October 2019 в 10:45

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

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