Найкращий спосіб розширити глобальну схему?


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

І як після цього надрукувати цей список?
Рогач

Це просто звичайний масив. З будь-яким масивом ви можете робити все, що тільки можете. Додано кілька прикладів.
манатура

1
Є проблема. Якщо шаблон не відповідає жодним файлам, він друкує себе - що не дуже добре.
Рогач

5
Ах, шоп-нульглоб вирішує це.
Рогач

1
@lindhe unsetoptі той самий параметр, що і для setopt.
манатство

-1

Не потрібно занадто ускладнювати речі:

echo your/stuff*

це не працює. Наприклад: TEST=$(echo your/stuff*) && eval \"$TEST\"вийде:your/stuff*: No such file or directory
Себастьян

@Sebastian це випуск нульових глобусів, дивіться вище
Олексій Аверченко

1
Ні, це не нульова проблема. Використання символів масштабування оцінює TESTзмінну як рядок, що включає *та не розширює.
Себастьян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.