Zsh递归通配排除当前目录文件失效问题求助
问题原因与解决方法
原因分析
你遇到的问题源于Zsh扩展排除模式的路径匹配逻辑差异:
- 当文件在子目录时,
**/*.mkv会生成带完整路径前缀的文件名(比如New Folder With Items/xxx.mkv),此时排除模式**/*AV1*能精准匹配带路径的AV1文件(比如New Folder With Items/xxx-AV1.mkv),这些文件会被正确从结果中剔除。 - 当文件在当前目录时,
**/*.mkv展开的是不带路径前缀的直接文件名(比如xxx-AV1.mkv),而**/*AV1*的模式默认优先识别带目录分隔符的路径结构,无法正确匹配当前目录下的纯文件名,导致排除规则失效,所有.mkv文件都被列出。
另外需确认Zsh的extended_glob和globstar选项是否开启——这两个选项是扩展排除模式和递归路径匹配的基础,Mac默认Zsh可能未开启extended_glob,会直接导致排除规则完全不生效。
解决方法
1. 开启必要的Zsh选项
先执行以下命令开启扩展匹配和递归路径匹配功能:
setopt extended_glob globstar
如果想永久生效,可将这行添加到~/.zshrc文件中,重启终端即可。
2. 使用正确的排除命令
使用更精准的模式,同时覆盖当前目录和子目录的AV1文件排除:
ls **/*.mkv~**/*AV1*.mkv
或用更简洁的^符号(与~功能一致):
ls **/*.mkv^**/*AV1*.mkv
该命令会递归列出所有.mkv文件,同时排除任何路径(包括当前目录)中文件名含AV1的.mkv文件,无论文件位置都能正常生效。
内容的提问来源于stack exchange,提问作者PineapplePie
相关产品推荐
相关产品推荐

