Как совместить ничего, если имя файла 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 к каждому результату для расширения пути. Полная функция оставлена в качестве упражнения.