Zsh glob 疑问:排除vendor/文件夹内文件的写法为何失效?
为什么
**/*~vendor/在zsh extendedglob下不生效? 首先得明确zsh扩展通配符(extendedglob)里~的作用:它是对前面的匹配结果做取反排除,但你的写法逻辑错了。
**/*的匹配范围是当前目录及子目录下的所有非隐藏文件/目录(包括vendor目录本身,以及vendor下面的所有文件)- 而
~vendor/只是排除了名为vendor/的这个目录条目,完全没处理它下面的文件,所以你还是会看到vendor目录里的内容,自然达不到“排除整个vendor文件夹内所有内容”的效果。
正确的写法
要排除vendor目录下的所有内容,得把取反的目标指向整个vendor路径下的条目:
用
~取反的正确写法:**/*~vendor/**这里
vendor/**匹配vendor目录下的所有内容,~把这些内容从**/*的结果里排除掉。更直观的写法(用
^前缀取反,extendedglob下支持):^vendor/**直接匹配所有不属于vendor目录下的内容,逻辑更清晰。
额外注意点
- 确保确实启用了extendedglob:可以用
setopt extendedglob命令确认(如果没开,先执行这个命令) - 如果要包含隐藏文件,需要加上
dotglob选项:setopt dotglob,否则**/*不会匹配.开头的文件
内容的提问来源于stack exchange,提问作者Mark Boulder
相关产品推荐
相关产品推荐

