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?
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. –
danke !!! @thatotherguy –