für Loop Glob Pannen

10

Ich versuche, ein Skript einzurichten, das eine Reihe von Verzeichnissen durchläuft, und mache eine Sache, wenn es JPG-Dateien findet, und eine andere, wenn es .nef-Dateien findet. Das Problem ist, wenn ein Verzeichnis beispielsweise keine JPG-Dateien (oder .nef) enthält, ist der Glob-Eintrag kein erweiterter Glob mehr, sondern nur noch eine Zeichenfolge. Zum Beispiel:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

Wenn der Ordner my_dir JPG-Dateien enthält, werden diese in der Befehlszeile korrekt wiedergegeben.

pictures/one.JPG
pictures/two.JPG

Wenn my_dir jedoch keine JPG-Dateien hat, wird die Schleife für eine Iteration und ein Echo eingegeben:

pictures/*.JPG

Wie konstruiere ich das so, dass wenn der Glob keine Übereinstimmungen hat, er nicht in die for-Schleife eintritt?

Vince W.
quelle

Antworten:

17

Dies ist normal und Standardverhalten: Wenn das Globbing nicht mit Dateien / Verzeichnissen übereinstimmt, bleibt das ursprüngliche Globbing-Zeichen erhalten.

Wenn Sie stattdessen ein leeres Ergebnis zurückerhalten möchten, können Sie die nullglobOption in Ihrem Skript wie folgt festlegen :

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Sie können es anschließend deaktivieren mit:

$ shopt -u nullglob
joepd
quelle
6

Ein bisschen seitwärts zu treten, findkann auch hier nützlich sein, wenn der Befehl, den Sie für die Dateien ausführen, einfach genug ist, um in eine Zeile zu fallen. Die Suche kann mehrere Pfade dauern und findet auch gerne Dateien in Unterverzeichnissen.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(Der ausgeführte Befehl wird nach dem -execFlag gegeben und endet mit ;. {}Wird durch den Namen der aktuellen Datei ersetzt.)

ilkkachu
quelle
2

Fügen Sie diese Zeile am Anfang Ihres Skripts hinzu

shopt -s nullglob
Steve
quelle