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?


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

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*

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.