Как исключить файл из команды с ZSH?

2207
yPhil

Учитывая содержание этого каталога:

one.file two.file three.file 

в баш, когда я вхожу

rm *.file !(two) 

только one.fileи three.fileудаляются. Как я могу сделать это в ZSH?

4
На самом деле вам нужно использовать `rm! (Two) .file` в bash. choroba 10 лет назад 2

2 ответа на вопрос

6
eToThePiIPower

Мне тоже был интересен ответ, и быстрый поиск обнаружил эту статью о глобализации в zsh . Основные моменты:

  • ^Действует как отрицание. Например, ls ^two.fileбудут перечислены только one.file и three.file.
  • Вы можете комбинировать ^и *. Например, ls ^two*перечислит все, что не начинается с «два»
  • Вы можете использовать скобки, чтобы сделать более сложные совпадения. Например, ls (^two).fileперечислим все, что не начать с «двух», и это закончится в «файл».
Сначала включите расширенную глобализацию: `setopt extended_glob` Emre 9 лет назад 3
@ Emre Большое спасибо, это была единственная информация, которая заняла у меня 2 часа, чтобы найти Luke 8 лет назад 0
2
mpy

Если вы хотите использовать синтаксис ksh ls !(two).file, просто включите KSH_GLOBопцию в zsh:

$ setopt KSH_GLOB $ ls -1 !(two).file one.file three.file 

Но zsh предоставляет другие мощные методы сглаживания, активируемые этой EXTENDED_GLOBопцией. Для получения полного списка, пожалуйста, прочитайте раздел Генерация файлов в man zshexpn. Наиболее актуальными для вопроса являются следующие операторы:

  • ^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