Я знаю, что существует довольно много вопросов, на которые отвечают, о том, как удалить все файлы с или без определенной строки на их имена, а также о том, как удалить все подпапки с определенной строкой на их имена.
Все же нет никаких вопросов относительно того, как удалить все подпапки без определенной строки, там называет.
Так, поскольку я имею, недавно столкнулся с такой проблемой, есть ли быстрая команда, которая поможет с этой ситуацией? Сценарий удара был бы достаточно хорош, также.
Править:
Подпапками я имел в виду только подпапки первого уровня, потому что я не хочу удалять или дважды косвенные подпапки второго уровня, которые могли бы иметь имена без строки подпапок первого уровня со строкой.
Давайте скажем, что Вы хотите запуститься 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
часть.
Расширенные операторы шарика оболочки удара могут сделать отрицание шаблона, например, данный
$ 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