Bash循环中如何添加_CN_模式,实现指定文件的筛选遍历?
修改后的代码
shopt -s dotglob extglob nullglob globstar for imfiles in "$dir"**/@(*-DT-*!(*.jpg)|*_CN_*!(*.jpg)|*.fff); do printf "File processed: %s\n" "$imfiles" done
代码解释
前置选项说明
shopt -s dotglob:让通配符匹配以.开头的隐藏文件shopt -s extglob:开启Bash扩展通配符模式,支持@()「或匹配」、!()「非匹配」等高级语法shopt -s nullglob:如果通配符没有匹配到任何文件,返回空列表,避免循环错误地把通配符字符串当作文件名处理shopt -s globstar:允许**递归匹配指定目录下的所有子目录(包括目录本身)
核心通配符模式分解
"$dir"**/@(*-DT-*!(*.jpg)|*_CN_*!(*.jpg)|*.fff) 是匹配逻辑的核心,拆分为三部分:
*-DT-*!(*.jpg):匹配**包含-DT-字符串且不是.jpg**的文件*-DT-*:确保文件名中存在-DT-子串,不管它在文件名的开头、中间还是结尾!(*.jpg):排除所有以.jpg结尾的文件,避免误匹配带-DT-的JPG文件
*_CN_*!(*.jpg):匹配**包含_CN_字符串且不是.jpg**的文件,逻辑和上面完全一致*.fff:匹配所有以.fff结尾的文件,这类文件本身不属于JPG,无需额外排除
额外优化
把原代码中的${imfiles}改成%s并将"$imfiles"作为printf的参数,是更安全的写法——如果文件名包含特殊字符(比如空格、换行符),能避免格式错误。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

