macOS zsh下使用ls命令隐藏大写开头目录的正确语法
适配需求的zsh命令
ls -dF *~[A-Z]*(/)
之前命令不生效的具体原因
- 写
*~[A-Z]*/的踩坑点在zsh通配符的*运算符优先级:zsh会先计算~两侧的集合差,再应用模式末尾的斜杠匹配规则。这个命令实际执行的逻辑是:先把所有以大写开头的项(包括README.md这类普通文件)全部排除,再从剩余内容里只保留目录类型,完全达不到“仅排除大写开头目录”的目标。 - 写
*~[A-Z]*的问题是没有区分项的文件类型,会把所有大写开头的普通文件一并过滤掉,不符合“保留大写开头普通文件”的要求。
语法逻辑说明
你已经开启了setopt extendedglob,zsh本身支持通配符类型限定,完全不需要靠在模式末尾硬写斜杠判断目录:
[A-Z]*(/)是一个完整的匹配单元:对应「所有文件名以大写字母开头、且属性为目录」的项,也就是需要排除的目标集合。- 开头的
*匹配当前目录下所有非隐藏的文件、目录全量集合。 ~是扩展通配符提供的差集运算符:表示从前面的全量集合中,移除后面匹配到的目标项。- 搭配的
ls -dF参数:-d用于直接列出目录本身而非目录内部内容,-F会自动给输出的目录名末尾加斜杠做类型标识,不需要手动在通配符里硬写斜杠,从根源避免优先级问题。
匹配效果验证
对应你给出的示例场景,当前目录包含:
- 目录:
Archive(大写开头目录,需排除)、data(小写开头目录,需保留) - 普通文件:
README.md(大写开头普通文件,需保留)、test.txt(小写普通文件,需保留)
执行上述命令后的输出完全符合预期:
data/ README.md test.txt
可选扩展
如果需要连带匹配隐藏文件、隐藏目录,可以给通配符加(D)限定符,调整为:
ls -dF *(D)~[A-Z]*(/D)
内容的提问来源于stack exchange,提问作者user15844128
相关产品推荐
相关产品推荐

