zsh 脚本 - 如何在文件名生成中不匹配模式?

zsh 脚本 - 如何在文件名生成中不匹配模式?

我目前正在尝试循环访问一组目录,但仅限我关心的目录。

$ ls -d */
cfdpost_statefiles/     p050L0260/  p050L0510/  p060L0390/  p070L0260/  p070L0510/  p092L0390/  p097L0260/  p110L0390/  p131L0325/  p150L0510/  profiles/
ERCOFTAC_TestSettings/  p050L0390/  p060L0260/  p060L0510/  p070L0390/  p084L0510/  p094L0325/  p100L0510/  p125L0510/  p136L0260/  p162L0260/  settings/

我想匹配除以和p###*开头的目录之外的所有目录。p125p150

如果我只是用管道做图案,我会得到:

$ for dir in ./p(125|150)*(/); echo $dir
./p125L0510
./p150L0510

但是,如果我尝试使用^它显示的内容在它的文档中:

$ for dir in ./p^(125|150)*(/); echo $dir
zsh: no matches found: ./p^(125|150)*(/)

有什么想法如何继续吗?

答案1

EXTENDED_GLOB需要为 zsh 设置选项。

要查看是否已设置,请运行setopt以显示已设置的选项:

$ setopt | grep glob
extendedglob

如果未设置,请运行setopt extended_glob.

注意:这将导致~^、 和#无法展开。


我的问题是,尽管我在 shell 中设置了此选项,我在脚本中运行 for 循环。该脚本启动自己的 shell 来运行,因此没有设置该选项。

要解决此特定问题,请放入setopt extendedglob脚本本身。

相关内容