Der beste Weg, um Glob Pattern zu erweitern?

29

Ich muss ein Glob-Muster (wie ../smth*/*oder /etc/cron*/) programmgesteuert in eine Liste von Dateien erweitern. Was wäre der beste Weg, dies zu tun?

Rogach
quelle
2
Sie brauchen nichts Besonderes zu tun, zitieren Sie das einfach nicht *.
Kevin
1
Verwenden Sie ein Array, wie in der Antwort angegeben, wenn Sie versuchen, es zu analysieren.
Kevin

Antworten:

40

Lassen Sie es einfach in der rechten Seite einer Array-Deklaration expandieren:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Beachten Sie, dass die Shell-Option festgelegt werden nullglobmuss.
Es ist nicht standardmäßig eingestellt.
Es verhindert einen Fehler, falls der Glob (oder einer von mehreren Globs) keinem Namen entspricht.

Stellen Sie es bashmit ein

shopt -s nullglob

oder in zshmit

setopt nullglob
Mann bei der Arbeit
quelle
Und wie drucke ich diese Liste anschließend aus?
Rogach
Es ist nur ein reguläres Array. Sie können mit jedem Array tun, was Sie können. Einige Beispiele hinzugefügt.
Manatwork
1
Es gibt ein Problem. Wenn das Muster mit keinen Dateien übereinstimmt, druckt es sich selbst - was nicht sehr gut ist.
Rogach
5
Ah, shopt -s nullglob löst es.
Rogach
1
@lindhe unsetoptund derselbe Parameter wie für setopt.
Manatwork
0

Keine Notwendigkeit, Dinge zu komplizieren:

echo your/stuff*
Alexei Averchenko
quelle
das geht nicht Zum Beispiel: TEST=$(echo your/stuff*) && eval \"$TEST\"wird ausgeben:your/stuff*: No such file or directory
Sebastian
@Sebastian Dies ist eine Nullglob-Ausgabe, siehe oben
Alexei Averchenko
1
Nein, es ist kein Nullglob-Problem. Bei der Verwendung von Scape-Zeichen wird die TESTVariable als Zeichenfolge ausgewertet , einschließlich *und nicht erweitert.
Sebastian