4

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

one.file
two.file
three.file

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

rm *.file !(two)

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

2 ответа2

6

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

  • ^ Действует как отрицание. Например, ls ^two.file будет перечислять только one.file и three.file.
  • Вы можете комбинировать ^ и * . Например, ls ^two* выведет список всего, что не начинается с "two"
  • Вы можете использовать скобки, чтобы сделать более сложные совпадения. Например, ls (^two).file перечислит все , что не начинается с "два", и делает конец в "файл".
2

Если вы хотите использовать синтаксис 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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .