для неудач глобуса петли

10

Я пытаюсь настроить скрипт, который будет зацикливаться на наборе каталогов, и делать одно, когда он находит файлы .jpg, и другое, когда он находит файлы .nef. Проблема в том, что если в каталоге нет файлов .jpg, например (или .nef), то запись глоба больше не является расширенным глобалом, а просто строкой. Например:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

если в папке my_dir находятся файлы .JPG, то они будут правильно отображаться в командной строке.

pictures/one.JPG
pictures/two.JPG

Однако, если my_dir не имеет файлов .JPG, цикл будет введен для одной итерации и выдает эхо:

pictures/*.JPG

как мне построить так, чтобы, если у шарика не было совпадений, он не входил в цикл for?

Винс В.
источник

Ответы:

17

Это нормальное и стандартное поведение: если глобализация не соответствует ни одному файлу / каталогу, оригинальный символ глобализации будет сохранен.

Если вы хотите получить пустой результат, вы можете установить nullglobопцию в вашем скрипте следующим образом:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Вы можете отключить его потом с помощью:

$ shopt -u nullglob
joepd
источник
6

Немного отступив, использование здесь findтакже может быть полезно, если команда, которую вы запускаете для файлов, достаточно проста, чтобы ее можно было перенести в одну строку. Поиск может занять несколько путей, и он также с радостью найдет любые файлы в подкаталогах.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(Выполненная команда дается после -execфлага, заканчивающегося символом ;. {}Заменяется именем текущего файла.)

ilkkachu
источник
3

добавьте эту строку в начало вашего скрипта

shopt -s nullglob
Стив
источник