2016-07-27 5 views
0

У меня есть директории a1..a5, b1..b5 и c1..c5. Внутри каждого каталога у меня есть два файла: a1, b1 и c1.Дважды Bash подмены команды

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

Я хочу, чтобы все файлы, начинающиеся с «а» или «B» внутри директорий, начиная с «а». Я могу сделать это с:

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

и получим:

/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

Теперь я буду использовать переменную DATA для хранения каталогов, а затем получить файлы:

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

В выход, содержимое DATA в порядке (/tmp/{a, b} *), но появляется следующая ошибка:

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

Любая идея, почему это происходит?

ответ

1

Я решил проблему, но я не могу найти никакой информации о том, почему мои предыдущие попытки не удались.

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

Выход:

/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

Это происходит потому, что Glob и фигурные скобки не бывают в двойных кавычках или строка задания, в то время как расширение Глобо случается после слова расщепления. Это означает, что если вы выполните «echo something» vs 'var = something; echo $ var', оба будут в конечном итоге расширяться, но только первые будут расширять фигурные скобки. –

+0

спасибо !!! @thatotherguy –