Как молча получить пустую строку из шаблона glob без совпадений

24

Скажем, у меня есть папка с тремя файлами:

foo1
foo2
bar

1. Если я бегу

list_of_files=$(print foo*)
echo $list_of_files

Я получил: foo1 foo2

2. Если я бегу

list_of_files=$(print bar*)
echo $list_of_files

Я получил: bar

3. Однако, если я бегу

list_of_files=$(print other*)
echo $list_of_files

Я получаю: zsh: no matches found: other*( $list_of_filesхотя переменная пуста)


Есть ли способ попросить Zsh не жаловаться, если он не может соответствовать расширению glob?

Моя цель - использовать механизм, описанный выше, для автоматического сбора списка файлов, которые соответствуют заданному шаблону глобуса.

Амелио Васкес-Рейна
источник

Ответы:

33

Включите null_globопцию для вашего паттерна с помощью Nквалификатора glob.

list_of_files=(*(N))

Если вы делаете это со всеми шаблонами в скрипте или функции, включите null_globопцию:

setopt null_glob

Этот ответ имеет эквиваленты bash и ksh.

Не используйте printи не заменяйте команду! Это генерирует строку, состоящую из имен файлов с пробелами между ними, вместо списка строк. (См. Что такое разделение слов? Почему это важно в программировании оболочки? )

Жиль "ТАК - перестань быть злым"
источник
15

Лучший способ: for a in *(.N); do ... ; done. Опция N заставляет zsh доставлять пустой список для for, а for будет повторять ноль раз.

Остерегайтесь ls *.foo(.N); когда ls получает пустой список аргументов, он перечисляет все файлы вместо ни одного. Вот почему мне не нравится NULL_GLOB (или его эквивалент bash): он изменяет все глобусы и легко прерывает вызовы, например, ls.

Арнт
источник
Представляю свой ответ здесь @arnt, это как раз то, что мне нужно.
gtd
Почему .в (.N)? Другие ответы сами (N)по себе, в чем разница?
Майкл Дорст
Вопрос был о файлах, и .ограничивает глобус, чтобы соответствовать только файлам.
Арнт
4

Я думаю, что вы ищете NULL_GLOBвариант:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.
enzotib
источник
-1

Попробуйте так:

list_of_files=$(print other*) 2>/dev/null

Он перенаправит вывод ошибок из stderr в / dev / null и не будет отображаться.

порыв
источник
Это не работает вообще.
Пабло Олмос де Агилера С.