You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本适配带中间后缀关联JPG文件的问题求助

解决Bash脚本匹配带中间后缀JPG文件的问题

问题说明

现有Bash脚本用于搜索rw2、raf、raw等格式的原始文件,当没有对应同名JPG文件时执行指定操作。但需求升级为:只要不存在任何以原始文件名开头的JPG文件(如file.jpg或file.something.jpg),就执行操作。之前尝试修改脚本(注释部分)未成功,推测是nullglob选项影响了通配符匹配。

解决方案

核心问题分析

  1. nullglob选项是必要的:它让*.ext在无匹配文件时不生成空字符串,避免循环处理不存在的文件名,这个设置没问题。
  2. 之前的错误:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:40:13