Answers:
最好这样做find
:
find ./foldername -maxdepth 1 -name '*.atest' -o -name '*.btest' -o -name '*.test'
-maxdepth 1
,以更接近地模仿ls
行为
-maxdepth
是一个GNU扩展。注3个与水珠其他方面的差异:find
将包括隐藏文件,不排序列表并不能匹配包含字节不是(像形成有效字符的文件名$'St\xe9phane.atest'
中使用UTF-8)
在
ls -d ./foldername/*.{a,b,}test
{a,b,...}
不是全局运算符,而是括号扩展,首先扩展为:
ls -d ./foldername/*.atest ./foldername/*.btest ./foldername/*.test
每个glob都会单独扩展,如果有任何glob不匹配,则会按您期望的那样取消该命令zsh
(或fish
;中的bash
;您需要failglob
获得类似行为的选项)。
在这里,您只想使用一个与所有这些文件都匹配的glob,并且仅在该glob与任何文件都不匹配时才取消命令:
ls -d ./foldername/*.(a|b|)test
您不想使用nullglob
,就像没有任何glob匹配一样,它会在ls
没有参数的情况下运行,因此请列出当前目录。cshnullglob
在这方面更好,因为它除去了不匹配的glob,但如果所有glob都不匹配,仍会取消命令。
您不想使用nonomatch
,因为那样会给您破坏行为的感觉,bash
这是一个耻辱。
对于在zsh
和中bash
均可使用的glob替代方案,您可以使用ksh glob (set -o kshglob
in zsh
和shopt -s extglob
in bash
)。
然后,您将执行以下操作:
ls -d ./foldername/*.@(a|b|)test
要么:
ls -d ./foldername/*.?([ab])test
在中添加failglob
选项,bash
以避免在ls
不匹配时将字面量直接传递给它。
请参见为什么nullglob不是默认值?欲获得更多信息。
?(...)
或+(...)
bash。
/dev/null
?