如何从没有匹配项的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扩展匹配?

我的目标是使用上述机制来静默收集与给定的glob模式匹配的文件列表。

Answers:



15

更好的办法:for a in *(.N); do ... ; done。N选项使zsh向for发送一个空列表,并且for将迭代零次。

提防ls *.foo(.N); 当ls收到一个空的参数列表时,它将列出所有文件,而不是所有文件。这就是为什么我不喜欢NULL_GLOB(或它的bash等效项)的原因:它更改了所有 glob并很容易中断对ls的调用。


想在这里@arnt看到您的答案,这正是我所需要的。
gtd

为什么.(.N)?其他答案(N)本身就有什么区别?
Michael Dorst

问题是关于文件的,并且.将全局限制为仅匹配文件。
arnt

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.

-1

尝试这种方式:

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

它将错误输出从stderr重定向到/ dev / null,并且不会显示。


那根本不起作用。
Pablo Olmos de Aguilera C.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.