Лучший способ расширить структуру шара?

29

Мне нужно расширить шаблон глобуса (например ../smth*/*, или /etc/cron*/) в список файлов программным способом. Каков будет лучший способ сделать это?

Рогач
источник
2
Вам не нужно делать ничего особенного, просто не цитируйте *.
Кевин
1
Хотя, если вы собираетесь пытаться разобрать его, используйте массив, как сказано в ответе.
Кевин

Ответы:

40

Просто дайте ему развернуться внутри правой части декларации массива:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


Обратите внимание, что параметр оболочки nullglobдолжен быть установлен.
Это не установлено по умолчанию.
Это предотвращает ошибку в случае, если глоб (или один из нескольких глобусов) не совпадает ни с одним именем.

Установите bashс помощью

shopt -s nullglob

или в zshс

setopt nullglob
manatwork
источник
И как мне распечатать этот список потом?
Рогач
Это просто обычный массив. Вы можете делать все что угодно с любым массивом. Добавил несколько примеров.
manatwork
1
Существует проблема. Если шаблон не соответствует ни одному файлу, он печатает сам, что не очень хорошо.
Рогач
5
Ах, шоп-нульглоб решает это.
Рогач
1
@lindhe, unsetoptи тот же параметр, что и для setopt.
Манатворк
-1

Не нужно усложнять вещи:

echo your/stuff*
Алексей Аверченко
источник
это не работает Например: TEST=$(echo your/stuff*) && eval \"$TEST\"выдаст:your/stuff*: No such file or directory
Себастьян
@ Себастьян, это вопрос нулевого шанса, см. Выше
Алексей Аверченко
1
Нет, это не проблема нульглоба. Использование символов scape оценивает TESTпеременную как строку, в том числе *и без расширения.
Себастьян