zsh: виключення файлів із шаблону


18

Скажіть, у мене є такі файли:

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else

Я подумав таку команду

print -l foo/*~{type_B*}

надрукує всі під foo крім речей , які починаються з , type_Bале це не робить, натомість він друкує все під взувши:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

Я також спробував print -l foo/*~type_Bі отримав те саме.

Як працює підстановка виключень ~у zsh?

Відповіді:


10

Вам потрібно включити каталог у виняток: print -l foo/*~foo/type_A*або print -l foo/*~{foo/type_A*}.

Якщо ви хочете, ви можете замінити каталог на підстановку: print -l foo/*~*/type_A*


Спасибі! Щодо другого шаблону, чи не проти пояснити, як foo/*~*/type_A*працює візерунок ? Чи *розширюється друга до кожної папки в робочому каталозі, або вона досить розумна, щоб лише розгорнутись foo?
Амеліо Васкес-Рейна

@roseck Оскільки це здається дуже швидким (наприклад, при запуску print *~**/*в /каталозі), я припускаю, що спочатку розгорніть перший шаблон, а потім видаліть всі збіги, які відповідають шаблону виключення.
jofel

2
@roseck ~чисто текстовий, частина до ~розгортання, як завжди, потім частина після зачистки матчів. Jofel Кращим випробуванням було б print /**/*~*: ви можете помітити, що воно обходить усе дерево, навіть якщо в ньому нічого не друкується.
Жиль "ТАК - перестань бути злим"

Я думав, що він хоче виключити type_B, але включити type_A.
системович

Правильна відповідь нижче
аріндін

30

zsh має ^глобальний оператор, коли EXTENDED_GLOB увімкнено. Це здається ідеальним для вашої заявленої ситуації:

setopt extendedglob
print -rl foo/^type_A*

Це означає "відповідати будь-чому, крім того, що відповідає наступному шаблону", але його ефект обмежений частиною шаблону між косою рисою, або між початком шаблону та першою косою рисою, або (як у цьому випадку) між останнім коса риса і кінець візерунка.

Ви можете переглянути параметри zsh, які зараз увімкнено за допомогою:

setopt

І відключіть EXTENDED_GLOB за допомогою:

unsetopt extendedglob
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.