Bash脚本适配带中间后缀关联JPG文件的问题求助
解决Bash脚本匹配带中间后缀JPG文件的问题
问题说明
现有Bash脚本用于搜索rw2、raf、raw等格式的原始文件,当没有对应同名JPG文件时执行指定操作。但需求升级为:只要不存在任何以原始文件名开头的JPG文件(如file.jpg或file.something.jpg),就执行操作。之前尝试修改脚本(注释部分)未成功,推测是nullglob选项影响了通配符匹配。
解决方案
核心问题分析
nullglob选项是必要的:它让*.ext在无匹配文件时不生成空字符串,避免循环处理不存在的文件名,这个设置没问题。- 之前的错误:
find命令中使用了单引号'${File%.*}*jpg',导致变量无法展开,无法正确匹配文件名。- 通配符匹配逻辑未覆盖“任意中间后缀”的场景。
两种可行实现方式
方式一:使用compgen快速检查
compgen -G会直接展开通配符,与Shell的文件名展开规则一致,无匹配时输出为空,适合快速判断:
#!/bin/bash shopt -s nullglob # 避免无匹配时通配符原样输出 for File in *.{rw2,raf,raw,dng,nef,cr2,new,orf} do # 检查是否存在以原文件名开头的任意JPG文件 if ! compgen -G "${File%.*}"*.jpg > /dev/null; then # 这里执行你的操作 echo "处理原始文件: $File - 未找到对应JPG" fi done
方式二:使用find精确查找
find适合更复杂的匹配场景,加上-quit可以在找到第一个匹配后立即退出,提升效率:
#!/bin/bash shopt -s nullglob # 避免无匹配时通配符原样输出 for File in *.{rw2,raf,raw,dng,nef,cr2,new,orf} do # 检查当前目录下是否存在以原文件名开头的JPG文件 if ! find . -maxdepth 1 -name "${File%.*}*.jpg" -print -quit; then # 这里执行你的操作 echo "处理原始文件: $File - 未找到对应JPG" fi done
关键说明
${File%.*}用于提取原始文件的文件名(去掉最后一个后缀),比如file.rw2会被处理为file。"${File%.*}"*.jpg会匹配所有以该文件名开头、后缀为jpg的文件,包括file.jpg、file.edit.jpg等。!符号用于取反判断:当没有匹配到任何JPG文件时,执行后续操作。
内容的提问来源于stack exchange,提问作者dargaud
相关产品推荐
相关产品推荐

