Zsh中对应Bash的globstar和dotglob的配置方法及递归遍历异常问题
Zsh中对应Bash的globstar和dotglob的配置方法及递归遍历异常问题
用户提问
我需要Zsh中等效于Bash里的shopt -s globstar和shopt -s dotglob的配置,该怎么操作?
更新内容
UPDATE 01:
按照@muru的回答,我在Zsh里用了setopt globdots,然后运行了下面的命令:
for i in INSTALL_USER_FILES/** ; do echo "=> '$i'" ; done
但结果只输出了:
=> 'INSTALL_USER_FILES/.local'
.local/目录里的内容并没有被递归列出来,这是怎么回事?
专家解答
先解决你最初的配置疑问:
Zsh和Bash的这两个通配符选项对应关系很明确:
- 对应Bash的
shopt -s dotglob(让通配符匹配隐藏文件/目录):Zsh中使用setopt globdots来开启,这个你已经用对了。 - 对应Bash的
shopt -s globstar(让**递归匹配所有层级的目录和文件):Zsh里默认就支持**的递归匹配,但它的默认行为和Bash有细微差异——如果不搭配正确的模式,它不会自动展开隐藏目录内的内容。
再针对你遇到的遍历异常问题分析:
你用INSTALL_USER_FILES/**作为匹配模式时,Zsh的**只会匹配到目标路径下所有层级的目录(包括.local这个隐藏目录),但不会主动进入目录去匹配里面的文件和子目录。想要递归列出所有内容,你需要把模式调整为INSTALL_USER_FILES/**/*,修改后的命令如下:
for i in INSTALL_USER_FILES/**/* ; do echo "=> '$i'" ; done
这样就能递归列出INSTALL_USER_FILES下所有层级的文件和子目录,包括.local里面的内容了。
另外给你个实用小技巧:如果你不想全局开启globdots,可以在单个通配符模式后添加(D)修饰符,比如INSTALL_USER_FILES/**/*(D),这样就能临时让这个模式匹配隐藏文件/目录,不用修改全局的shell配置。
备注:内容来源于stack exchange,提问作者rusty
相关产品推荐
相关产品推荐

