Wie kann ich eine Datei mit ZSH von einem Befehl ausschließen?

2215
yPhil

Angesichts dieses Verzeichnisinhalts:

one.file two.file three.file 

in bash, wenn ich eintrete

rm *.file !(two) 

nur one.fileund three.filewerden gelöscht. Wie kann ich das in ZSH machen?

4
In der Tat müssen Sie `rm! (Two) .file` in bash verwenden. choroba vor 9 Jahren 2

2 Antworten auf die Frage

6
eToThePiIPower

Ich war auch an der Antwort interessiert, und eine kurze Suche fand sich in diesem Artikel über das Globbing in zsh . Die Höhepunkte:

  • ^Fungiert als Negation. Beispielsweise ls ^two.filewerden nur die Dateien "one.file" und "three.file" aufgeführt.
  • Sie können ^und kombinieren *. Zum Beispiel ls ^two*wird alles aufgelistet, was nicht mit "zwei" beginnt
  • Sie können Klammern verwenden, um komplexere Übereinstimmungen zu erstellen. Zum Beispiel ls (^two).filewird alles aufgelistet, die nicht mit „zwei“ beginnen, und nicht in „Datei“ enden.
Aktivieren Sie zuerst das erweiterte Globbing: `setopt extended_glob` Emre vor 8 Jahren 3
@Emre Vielen Dank, das war die Info, für die ich 2 Stunden gebraucht habe Luke vor 8 Jahren 0
2
mpy

Wenn Sie die ksh-Syntax verwenden möchten, aktivieren Sie ls !(two).fileeinfach die KSH_GLOBOption in zsh:

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

Zsh bietet jedoch andere leistungsstarke Globbing-Techniken, die durch die EXTENDED_GLOBOption aktiviert werden . Für eine vollständige Liste lesen Sie bitte den Abschnitt DATEINAME GENERATION in man zshexpn. Am relevantesten für die Frage sind diese Operatoren:

  • ^xstimmt mit nichts außer dem Muster x überein, also in Ihrem Fallls -1 ^two.file
  • x~yist leistungsfähiger, da es mit allem übereinstimmt, das mit dem Muster x übereinstimmt, aber nicht mit y übereinstimmt ls -1 *~two.file. Das Besondere ist, dass Sie ein anderes Globbing-Muster für x verwenden können, z

    $ ls -1 *.file~two* one.file three.file 

    Dies ist beim ^Operator nicht möglich, was in diesem Fall gleichbedeutend ist mit *~:

    $ ls -1 *.file^two* one.file three.file two.file