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

Если у вас установлен Ubuntu, вы можете установить версию Lazarus из репозитория программного обеспечения. Значок рабочего стола должен выглядеть так:

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

1 ответ

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

]

$ rm -rf !(*foo*)

удаляет (рекурсивно) все каталоги верхнего уровня, не содержащие строку foo, оставляя [ ! d3]

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

1 directory, 2 files

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

]

 % 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

, поэтому

[ f7]

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

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

1 directory, 5 files
4
ответ дан 23 May 2018 в 08:06
  • 1
    Спасибо за то, что дал мне вескую причину, чтобы дать zsh попробовать :))) Оказывается, это намного более продвинутый, чем bash, что хорошо: D – PyGeek03 16 July 2016 в 22:03

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

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