Как совместить ничего, если имя файла glob не имеет совпадений
Я хочу перебрать все файлы с расширением jpg
или txt
. Я использую:
for file in myDir/*.{jpg,txt}
do
echo "$file"
done
Проблема: Если в каталоге вообще нет файла jpg, цикл будет иметь одну итерацию с выводом myDir/*.jpg
. Я думал *
будет заменен произвольным файлом (и если файл не существует, он не может быть расширен). Как я могу избежать нежелательной итерации?
Ответы
Ответ 1
Используйте это, чтобы избежать нежелательной итерации:
shopt -s nullglob
От man bash
:
nullglob
: если установлено, bash позволяет шаблонам, которые не соответствуют файлам (см. Расширение имени пути выше), расширяться до нулевой строки, а не непосредственно.
Смотрите: help shopt
и shopt
Ответ 2
Этот и повторяющийся вопрос были связаны не только с расширением пути, но и с фигурной скобкой, а также с дубликатом, заданным для POSIX.
compgen -G
делает bash --posix
совместимым расширением пути (без расширения скобок) и... как вы уже догадались: ничего не даст, если совпадений нет.
Поэтому для этого напишите функцию bash --posix
. Краткое описание: временно используйте set -f
чтобы сначала выполнить раскрытие скобок (без расширения имени пути) через эхо, затем применить compgen -G
к каждому результату для расширения пути. Полная функция оставлена в качестве упражнения.