在zsh中高效实现文件名不区分大小写搜索并调用命令的方法问询
zsh下高效匹配首个大小写变体文件并执行命令的优化方案
你的find写法是可行的,但zsh自带的内置glob功能无需启动外部进程,效率更高,写法也更简洁优雅。下面是几种优化方案:
方案1:使用glob限定符实现独立的大小写不敏感匹配
无需修改全局shell选项,直接通过#i限定符指定当前glob为大小写不敏感,同时用N(无匹配时返回空)和.(仅匹配普通文件)限定符精准匹配:
# 获取当前目录下首个匹配的文件(大小写不敏感) FILE=(./foo(#iN.)) # 找到文件则执行命令 if [[ -n $FILE ]]; then command-dummy "$FILE" fi
#i:开启当前glob的大小写不敏感匹配,匹配foo/Foo/FOo等所有变体N:null_glob,无匹配结果时返回空数组而非报错.:仅匹配普通文件(等价于find的-type f)- 数组赋值
FILE=(...)会自动取首个匹配项(默认按字母排序,若要和find一样按文件系统存储顺序,加上oN限定符:./foo(#iN.oN.))
方案2:临时开启大小写不敏感选项(适合多匹配场景)
如果脚本中需要多次进行大小写不敏感匹配,可以临时开启nocaseglob选项,作用域仅限当前代码块,不影响全局设置:
# 临时开启大小写不敏感匹配+null_glob setopt local_options nocaseglob null_glob # 取首个匹配的普通文件 FILE=(./foo(.)) [[ -n $FILE ]] && command-dummy "$FILE"
local_options:确保选项仅在当前shell上下文生效,避免污染全局配置nocaseglob:全局开启当前上下文的大小写不敏感glob匹配
方案3:极简直接执行写法
如果不需要保存文件路径变量,可直接在命令中使用glob取首个匹配项:
setopt local_options nocaseglob null_glob command-dummy ./foo(.[1]) 2>/dev/null
.[1]:明确取glob匹配结果的第一个元素2>/dev/null:避免无匹配时命令因缺少参数报错(根据实际命令需求决定是否添加)
为什么比find高效?
find是外部命令,需要启动新进程;而zsh的glob是内置功能,直接在shell进程内处理,减少了进程开销,尤其是在频繁执行的脚本中优势明显。
内容的提问来源于stack exchange,提问作者abu_bua
相关产品推荐
相关产品推荐

