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

Git Bash遍历JPEG图片压缩脚本报错:变量未匹配实际文件

解决Bash脚本中通配符未匹配文件的问题

这个问题我之前也踩过坑!当你用*.jpeg作为循环变量时,如果当前目录里没有任何.jpeg后缀的文件,Bash不会自动展开通配符,而是把*.jpeg当作一个字面量字符串处理,这就导致了后面convert命令找不到文件的错误。

下面给你几个实用的解决方案:

1. 开启nullglob选项(推荐)

Bash有个nullglob选项,开启后如果通配符匹配不到任何文件,会直接移除这个模式,循环根本不会执行,也就不会报错了。修改后的脚本如下:

#!/bin/bash
# 开启nullglob,避免通配符未匹配时保留字面量
shopt -s nullglob

for f in *.jpeg; do
    echo "Processing $f file.."
    # 这里建议不要直接覆盖原文件,先输出到带后缀的文件更安全
    convert -quality 85% "$f" "${f%.jpeg}_compressed.jpeg"
    # 如果一定要覆盖原文件,可以用临时文件过渡,防止转换失败丢失原文件:
    # convert -quality 85% "$f" "$f.tmp" && mv "$f.tmp" "$f"
done

# 可选:关闭nullglob恢复默认行为
shopt -u nullglob

2. 先检查文件是否存在

如果不想修改Bash的默认选项,可以在循环里先判断当前的$f是不是真实存在的文件:

#!/bin/bash
for f in *.jpeg; do
    # 只有当$f是真实文件时才处理
    if [[ -f "$f" ]]; then
        echo "Processing $f file.."
        convert -quality 85% "$f" "$f"
    fi
done

3. 匹配更多可能的图片后缀

有时候目录里的图片可能是.jpg(小写)或者.JPEG(大写),可以用扩展通配符匹配多种后缀:

#!/bin/bash
shopt -s nullglob
# 匹配jpeg、jpg以及它们的大写形式
for f in *.{jpeg,jpg,JPEG,JPG}; do
    echo "Processing $f file.."
    convert -quality 85% "$f" "${f%.*}_compressed.${f##*.}"
done
shopt -u nullglob

最后提醒一句:直接用convert覆盖原文件有风险,如果转换过程中出错,原文件可能损坏,所以优先用临时文件或者新文件名的方式处理哦!

内容的提问来源于stack exchange,提问作者nikksan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:31:10