Shell for循环如何同时匹配含指定字符串与指定扩展名的文件
实现方法
前置准备
你当前用的是Bash的扩展通配语法,首先要在脚本里开启必要的shell选项,否则递归匹配、扩展通配都不会正常生效,在循环前加一行:
shopt -s globstar extglob nullglob
三个选项的作用:
globstar:让**支持递归遍历所有层级的子目录extglob:启用扩展通配,支持!()这类排除语法nullglob:没有匹配到文件时通配符返回空值,不会把通配字符串本身当成文件名传入循环
修改后的遍历代码
直接用Bash的大括号展开语法,把两类文件的匹配规则并列写在通配位置即可,完整代码如下:
local dir imfiles shopt -s globstar extglob nullglob for imfiles in "$dir"/**/{*-DT-!(*.*),*.fff}; do # 跳过匹配到的目录,仅处理普通文件 [[ -f $imfiles ]] || continue printf "File processed: %s\n" "$imfiles" # 后续添加你的文件处理逻辑即可 done
匹配规则说明
大括号内的两个模式分别对应你需要的两类文件:
*-DT-!(*.*):匹配文件名包含-DT-、且文件名里没有.的文件,也就是你说的无扩展名的-DT-文件,不会误匹配xxx-DT-xxx.jpg这类带后缀的文件*.fff:匹配所有扩展名为.fff的文件
如果你需要的带
-DT-文件不是完全无扩展名,只是要排除特定后缀(比如你原来代码里排除.jpg的逻辑),可以把!(*.*)替换成对应的排除规则,比如!(.jpg)就会匹配所有带-DT-、后缀不是.jpg的文件。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

