我目前正在尝试循环访问一组目录,但仅限我关心的目录。
$ 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###*
开头的目录之外的所有目录。p125
p150
如果我只是用管道做图案,我会得到:
$ 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
脚本本身。