So erhalten Sie eine leere Zeichenfolge aus einem Glob-Muster ohne Übereinstimmungen

24

Angenommen, ich habe einen Ordner mit drei Dateien:

foo1
foo2
bar

1. Wenn ich renne

list_of_files=$(print foo*)
echo $list_of_files

Ich bekomme: foo1 foo2

2. Wenn ich renne

list_of_files=$(print bar*)
echo $list_of_files

Ich bekomme: bar

3. Allerdings, wenn ich renne

list_of_files=$(print other*)
echo $list_of_files

Ich bekomme: zsh: no matches found: other*(die Variable $list_of_filesist allerdings leer)


Gibt es eine Möglichkeit, zsh zu bitten, sich nicht zu beschweren, wenn es nicht mit einer Glob-Erweiterung übereinstimmt?

Mein Ziel ist es, den Mechanismus oben zu verwenden , um schweigend eine Liste von Dateien zu sammeln , die ein bestimmtes glob Muster entspricht.

Amelio Vazquez-Reina
quelle

Antworten:

33

Aktivieren Sie die null_globOption für Ihr Muster mit dem NGlob-Qualifizierer.

list_of_files=(*(N))

Wenn Sie dies für alle Muster in einem Skript oder einer Funktion tun, aktivieren Sie die null_globOption:

setopt null_glob

Diese Antwort enthält Bash- und Ksh-Entsprechungen.

Keine printSubstitution verwenden oder befehlen! Dadurch wird anstelle einer Liste von Zeichenfolgen eine Zeichenfolge generiert, die aus den Dateinamen mit Leerzeichen besteht. (Siehe Was ist Wortteilung? Warum ist es bei der Shell-Programmierung wichtig? )

Gilles 'SO - hör auf böse zu sein'
quelle
15

Der bessere Weg: for a in *(.N); do ... ; done. Die N-Option bewirkt, dass zsh eine leere Liste an for liefert und for null Mal iteriert.

Pass auf ls *.foo(.N); Wenn ls eine leere Argumentliste erhält, listet es alle Dateien statt keiner auf. Dies ist der Grund, warum ich NULL_GLOB (oder dessen Bash-Äquivalent) nicht mag: Es ändert alle Globs und unterbricht leicht Aufrufe von zB ls.

Arnt
quelle
Möchten Sie Ihre Antwort hier sehen, @arnt, das ist genau das, was ich brauchte.
gtd
Warum das .in (.N)? Andere Antworten haben sich (N)von selbst, was ist der Unterschied?
Michael Dorst
Die Frage .betraf Dateien und schränkt den Glob so ein, dass er nur mit Dateien übereinstimmt.
Arnt
4

Ich denke, Sie suchen nach der NULL_GLOBOption:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.
Enzotib
quelle
-1

Versuchen Sie diesen Weg:

list_of_files=$(print other*) 2>/dev/null

Die Fehlerausgabe von stderr wird nach / dev / null umgeleitet und nicht angezeigt.

eilen
quelle
Das geht gar nicht.
Pablo Olmos de Aguilera C.