zsh: Dateien von einem Muster ausschließen

18

Angenommen, ich habe die folgenden Dateien:

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

Ich dachte den folgenden Befehl

print -l foo/*~{type_B*}

drucke alles unter foo außer den Dingen, die damit beginnen type_B, aber nicht, stattdessen druckt es alles unter foo:

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

Ich habe es auch versucht print -l foo/*~type_Bund das Gleiche bekommen.

Wie funktioniert der Platzhalter für Ausnahmen ~in zsh?

Amelio Vazquez-Reina
quelle

Antworten:

10

Sie müssen das Verzeichnis in die Ausnahme einschließen: print -l foo/*~foo/type_A*oder print -l foo/*~{foo/type_A*}.

Wenn Sie möchten, können Sie das Verzeichnis durch einen Platzhalter ersetzen: print -l foo/*~*/type_A*

Jofel
quelle
Vielen Dank! Was das zweite Muster betrifft, macht es Ihnen etwas aus, zu erklären, wie das Muster foo/*~*/type_A*funktioniert? *Erweitert der zweite Ordner auf jeden Ordner im Arbeitsverzeichnis oder ist er intelligent genug, um nur auf diesen Ordner zu erweitern foo?
Amelio Vazquez-Reina
@roseck Da es sehr schnell zu sein scheint (zum Beispiel wenn Sie print *~**/*im /Verzeichnis laufen ), gehe ich davon aus, dass es zuerst das erste Muster erweitert und dann alle Übereinstimmungen entfernt, die zum Ausschlussmuster passen.
Jofel
2
@roseck ~ist rein textuell, der Teil vor dem ~erweitert sich wie immer, dann stimmt der Teil nach dem Entfernen überein. @Jofel Ein besserer Test wäre print /**/*~*: Sie können beobachten, dass er den gesamten Baum durchläuft, auch wenn er am Ende nichts druckt .
Gilles 'SO- hör auf böse zu sein'
Ich dachte, er wollte type_B ausschließen, aber type_A einschließen.
Systemovich
Die richtige Antwort ist unten
Aryndin
30

zsh hat den ^Glob-Operator, wenn EXTENDED_GLOB aktiviert ist. Es scheint die perfekte Lösung für Ihre Situation zu sein:

setopt extendedglob
print -rl foo/^type_A*

Es bedeutet „Alles abgleichen, außer dem, was mit dem folgenden Muster übereinstimmt“, aber seine Wirkung ist auf den Teil des Musters zwischen Schrägstrichen oder zwischen dem Anfang des Musters und dem ersten Schrägstrich oder (wie in diesem Fall) zwischen dem letzten begrenzt Schrägstrich und das Ende des Musters.

Sie können die zsh- Optionen anzeigen, die derzeit aktiviert sind mit:

setopt

Und deaktiviere EXTENDED_GLOB mit:

unsetopt extendedglob
Chris Johnsen
quelle