it-swarm.com.de

wie lässt man Bash Wildcards in Variablen erweitern?

Ich versuche, den gleichen Effekt wie das Tippen zu erzielen

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  

in der Befehlszeile aus einem Bash-Skript. Ich habe:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

was, wenn ausgeführt, den nicht unerwarteten Fehler ergibt:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory

Wie kann man das alles richtig zitieren, damit mv tatsächlich die gewünschte Erweiterung ausführt? (Ja, es gibt viele Dateien, die dem Muster in ./images/ entsprechen.)

24
Ross Duncan

Eine gelöschte Antwort war auf dem richtigen Weg. Eine kleine Modifikation an Ihrem Versuch:

shopt -s extglob
MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='@(pdf|eps|jpg|svg)'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

Die Klammererweiterung wird vor der Variablenerweiterung durchgeführt, die Variablenerweiterung jedoch vor der Erweiterung des Pfadnamens. Die geschweiften Klammern sind also immer noch geschweifte Klammern, wenn die Variable in Ihrem Original erweitert wird. Wenn die Variable jedoch stattdessen Pfadnamenelemente enthält, wurden sie bereits erweitert, wenn die Erweiterung des Pfadnamens abgeschlossen ist.

26

Sie müssen diese Zeile auswerten, damit sie wie folgt funktioniert:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\""

Nun, dies hat Probleme, insbesondere wenn Sie $SUFFIXES nicht vertrauen, es könnte einen Injektionsangriff enthalten, aber für diesen einfachen Fall sollte es in Ordnung sein.

Wenn Sie offen für andere Lösungen sind, möchten Sie möglicherweise mit find und xargs experimentieren.

8
falstro

Sie können eine Funktion schreiben:

function expand { for arg in "[email protected]"; do [[ -f $arg ]] && echo $arg; done }

dann nennen Sie es mit dem, was Sie erweitern möchten:

expand "$MYDIR/"*.$SUFFIXES

Sie können es auch zu einem Skript expand.sh machen, wenn Sie möchten.

0
Dagang