You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 12:24:32