Как удалить все подпапки первого уровня, которые не имеют указанной строки на их имена

Я знаю, что существует довольно много вопросов, на которые отвечают, о том, как удалить все файлы с или без определенной строки на их имена, а также о том, как удалить все подпапки с определенной строкой на их имена.

Все же нет никаких вопросов относительно того, как удалить все подпапки без определенной строки, там называет.

Так, поскольку я имею, недавно столкнулся с такой проблемой, есть ли быстрая команда, которая поможет с этой ситуацией? Сценарий удара был бы достаточно хорош, также.

Править:

Подпапками я имел в виду только подпапки первого уровня, потому что я не хочу удалять или дважды косвенные подпапки второго уровня, которые могли бы иметь имена без строки подпапок первого уровня со строкой.

3
задан 16 July 2016 в 13:53

2 ответа

Давайте скажем, что Вы хотите запуститься find в текущем каталоге и ограничить его первым уровнем подкаталогов:

find . -maxdepth 1

Эти find команда имеет полезный флаг -not (или !), который инвертирует следующий тест. Таким образом, для нахождения имени, которое делает не , содержат подстроку, добавляют

-not -name "*substring*"

ВАЖНЫЙ: Вы захотите исключить сам текущий каталог также. Иначе целый текущий каталог был бы удален.

-not -name "."

Затем Вы хотите протестировать на каталоги только:

-type d

И, если все выглядит хорошим, Вы хотите удалить эти каталоги:

-exec rm -rf {} \;

, который говорит "для всех найденных каталогов, выполните эту команду". Эти {} заполнитель для названия каталога (включая полный путь, таким образом, это работает над корректным). \; указывает на конец команды, которая будет выполняться.

Суммирование:

find . -maxdepth 1 -not -name "*substring*" -not -name "." -type d -exec rm -rf {} \;

должен работать. Но сначала, испытайте его без -exec часть.

9
ответ дан 1 December 2019 в 13:01

Расширенные операторы шарика оболочки удара могут сделать отрицание шаблона, например, данный

$ tree .
.
├── subdir
│  ├── other file
│  └── somefile
├── subdirbar
│  ├── other file
│  └── somefile
├── subdirbaz
│  ├── other file
│  └── somefile
└── subdirfoo
    ├── other file
    └── somefile

4 directories, 8 files

затем, если расширено globbing включен (shopt -s extglob)

$ rm -rf !(*foo*)

удаляет (рекурсивно) все каталоги верхнего уровня, не содержащие строку foo, отъезд

$ tree
.
└── subdirfoo
    ├── other file
    └── somefile

1 directory, 2 files

Однако это также удалило бы любые файлы с именами, не содержащими foo на верхнем уровне. Удар AFAIK расширенные шарики не могут отличить файлы от каталогов - но zsh, обеспечивает спецификаторы шарика, которые позволяют это, например, данный

 % tree
.
├── foofile
├── other file
├── somefile
├── subdir
│  ├── other file
│  └── somefile
├── subdirbar
│  ├── other file
│  └── somefile
├── subdirbaz
│  ├── other file
│  └── somefile
└── subdirfoo
    ├── other file
    └── somefile

4 directories, 11 files

затем в zsh

 % setopt EXTENDED_GLOB

 % ls -d (^(*foo*))   
other file  somefile  subdir  subdirbar  subdirbaz

тогда как добавление (/) спецификатор каталога

 % ls -d (^(*foo*))(/)
subdir  subdirbar  subdirbaz

так

 % rm -rf (^(*foo*))(/)

удаляет только каталоги, имена которых не включают строку foo, отъезд простых неповрежденных файлов.

 % tree
.
├── foofile
├── other file
├── somefile
└── subdirfoo
    ├── other file
    └── somefile

1 directory, 5 files
4
ответ дан 1 December 2019 в 13:01

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

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