Учитывая содержание этого каталога:
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.filex~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