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


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

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переменную как строку, в том числе *и без расширения.
Себастьян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.