Как молча получить пустую строку из шаблона 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.