Ich möchte alle Dateien in einem Ordner zur Liste genannt , foldername
dass die Erweiterung hat test
, atest
oder btest
.
Mein unmittelbarer Gedanke war zu rennen ls ./foldername/*.{a,b,}test
Dies funktioniert einwandfrei, es sei denn, die Erweiterung enthält nichts atest
. In diesem Fall wird der Fehler angezeigt zsh: no matches found: ./foldername/*.atest
.
Kann ich diesen Fehler einfach ignorieren und die vorhandenen Dateien drucken?
Ich brauche das, um sowohl in ZSH als auch in BASH zu arbeiten.
/dev/null
?Antworten:
Es kann am besten sein, dies zu tun mit
find
:quelle
-maxdepth 1
, um dasls
Verhalten näher zu emulieren-maxdepth
es sich um eine GNU-Erweiterung handelt. Anmerkung 3 andere Unterschiede zu Globs: Enthältfind
versteckte Dateien, sortiert die Liste nicht und stimmt nicht mit Dateinamen überein, die Bytes enthalten, die keine gültigen Zeichen bilden (wie$'St\xe9phane.atest'
in einem UTF-8-Gebietsschema)Im
{a,b,...}
ist kein Glob-Operator, das ist eine Klammererweiterung, die zuerst erweitert wurde auf:Und jeder Glob wird einzeln erweitert, und wenn ein Glob nicht übereinstimmt, wird der Befehl wie erwartet abgebrochen
zsh
(oderfish
; inbash
benötigen Sie diefailglob
Option, um ein ähnliches Verhalten zu erzielen).Hier möchten Sie einen einzelnen Glob verwenden, der mit all diesen Dateien übereinstimmt, und den Befehl nur abbrechen, wenn dieser eine Glob keiner Datei entspricht:
Sie möchten nicht verwenden
nullglob
, als ob keiner der Globs übereinstimmt, es würdels
ohne Argumente ausgeführt, also listen Sie das aktuelle Verzeichnis auf.cshnullglob
ist in dieser Hinsicht besser, da nicht übereinstimmende Globs entfernt werden, der Befehl jedoch abgebrochen wird, wenn nicht alle Globs übereinstimmen.Sie würden nicht verwenden wollen
nonomatch
, da dies Ihnen das gebrochene Verhalten gebenbash
würde, dessen Schande eine Schande wäre.Für eine Glob-Alternative, die in beiden
zsh
und funktioniertbash
, können Sie die ksh-Globs (set -o kshglob
inzsh
undshopt -s extglob
inbash
) verwenden.Dann würden Sie tun:
oder:
Fügen Sie die
failglob
Option hinzubash
, um zu vermeiden, dass der Globus buchstäblich an übergeben wird,ls
wenn er nicht übereinstimmt.Siehe Warum ist nullglob nicht die Standardeinstellung? für mehr Informationen.
quelle
?(...)
oder+(...)
für Bash verwenden.