如何在 ZSH 中循环选择文件扩展名?

如何在 ZSH 中循环选择文件扩展名?

我正在寻找与此 BASH 结构等效的 ZSH:

for file in *.{abc,def,ghi}; do #loop through all files with the extensions .abc, .def and .ghi

我找不到 ZSH 的类似构造。或者也许没有?

答案1

假设您有以下文件:foo.abc, bar.abc, qux.ghi.在 bash 中,循环体执行四次:使用foo.abc, bar.abc, *.def(使用文字*)和qux.ghi。在 zsh 中,使用默认选项,循环根本不执行,而是出现错误

zsh:1: no matches found: *.def

为了避免在未展开的通配符模式上运行循环并在现有文件(如果有)上运行循环,请添加N全局限定符

for file in *.{abc,def,ghi}(N); do …

您还可以使用|操作员,这样您就有一个模式而不是多个模式。 (大括号不是通配符模式,它们只是在解析通配符之前发生的文字字符串扩展,即*.{abc,def,ghi}(N)只是 的简写*.abc(N) *.def(N) *.ghi(N)

for file in *.(abc|def|ghi)(N); do …

请注意,您仍然需要Nglob 限定符,否则如果没有文件匹配,您将收到错误。

N您可以不使用glob 限定符打开该null_glob选项( setopt null_glob)。这在脚本中通常是有意义的。请注意,在 bash 中,您需要激活类似的选项 ( shopt -s nullglob) 以避免在未展开的模式上运行循环体。

相关内容