Учитывая содержание этого каталога:
one.file
two.file
three.file
в баш, когда я вхожу
rm *.file !(two)
удаляются только one.file
и three.file
. Как я могу сделать это в ZSH?
Мне тоже был интересен ответ, и быстрый поиск обнаружил эту статью о глобализации в zsh. Основные моменты:
^
Действует как отрицание. Например, ls ^two.file
будет перечислять только one.file и three.file.^
и *
. Например, ls ^two*
выведет список всего, что не начинается с "two"ls (^two).file
перечислит все , что не начинается с "два", и делает конец в "файл".Если вы хотите использовать синтаксис ksh ls !(two).file
, просто включите опцию KSH_GLOB
в zsh:
$ setopt KSH_GLOB
$ ls -1 !(two).file
one.file
three.file
Но zsh предоставляет другие мощные методы сглаживания, активируемые опцией EXTENDED_GLOB
. Для получения полного списка, пожалуйста, прочитайте раздел FILENAME GENERATION в man zshexpn
. Наиболее актуальными для вопроса являются следующие операторы:
^x
соответствует чему угодно, кроме шаблона x, поэтому в вашем случае ls -1 ^two.file
x~y
более мощный, так как он соответствует всему, что соответствует шаблону x, но не соответствует y, поэтому ls -1 *~two.file
. Особенность в том, что вы можете использовать другой шаблон сглаживания для х, например
$ ls -1 *.file~two*
one.file
three.file
Это невозможно с оператором ^
, который в данном случае эквивалентен *~
:
$ ls -1 *.file^two*
one.file
three.file
two.file