2016-07-27 21 views
0

Ich habe Verzeichnisse a1..a5, b1..b5 und c1..c5. In jedem Verzeichnis habe ich zwei Dateien a1, b1 und c1.Zweimal Bash Kommandosubstitution

do mkdir /tmp/{a,b}$d; touch /tmp/{a,b,c}$d/{a,b,c}1; done; 

Ich möchte alle Dateien bekommen mit ‚a‘ beginnen oder ‚b‘ innerhalb der Verzeichnisse mit einem ‚a‘ beginnen. Ich kann es mit:

DIRS=`ls -1 -d /tmp/{a,b}*/a*` 
echo ${DIRS} 

und erhalten:

/tmp/a1/a1 /tmp/a2/a1 /tmp/a3/a1 /tmp/a4/a1 /tmp/a5/a1 /tmp/b1/a1 /tmp/b2/a1 /tmp/b3/a1 /tmp/b4/a1 /tmp/b5/a1

Jetzt werde ich eine Variable verwenden DATA aufgerufen, um die Verzeichnisse zu speichern und später die Dateien erhalten:

DATA="/tmp/{a,b}*" 
echo ${DATA} 
DIRS=`ls -1 -d ${DATA}/a*` 
echo ${DIRS} 

In der Ausgang, der Inhalt DATA ist OK (/tmp/{a, b} *), aber ich erhalte den folgenden Fehler:

ls: cannot access /tmp/{a,b}*/a*: No such file or directory

Eine Idee, warum das passiert?

Antwort

1

Ich löste das Problem, aber ich kann keinen Hinweis darauf finden, warum meine vorherigen Versuche gescheitert sind.

DATA="/tmp/{a,b}*" 
echo ${DATA} 
DIRS=`eval "ls -1 -d ${DATA}/a*"` 
echo ${DIRS} 

Ausgang:

/tmp/a1/a1 /tmp/a2/a1 /tmp/a3/a1 /tmp/a4/a1 /tmp/a5/a1 /tmp/b1/a1 /tmp/b2/a1 /tmp/b3/a1 /tmp/b4/a1 /tmp/b5/a1

+1

Dies geschieht, weil glob und Klammer Expansion nicht in doppelten Anführungszeichen oder String Zuweisungen passieren, während glob Expansion nach Wort Spaltung geschieht. Dies bedeutet, dass, wenn Sie etwas "widerhallen" vs var = etwas; echo $ var', beide enden mit der Erweiterung von Globs, aber nur die ersteren werden am Ende Klammern erweitern. –

+0

danke !!! @thatotherguy –