如何在Bash中通过MIME类型为无后缀JPG、MP4文件添加对应扩展名
解决方案
实现思路
- 用
file命令的--mime-type参数读取文件真实MIME类型,比手动匹配魔数更稳定 - 匹配规则:
image/jpeg对应添加.jpg扩展名,video/mp4对应添加.mp4扩展名 - 自动跳过目录、符号链接、已有扩展名的文件,避免误修改
操作步骤
第一步:验证识别效果(推荐先测试)
先执行单文件测试,确认file命令识别结果符合预期:
file --mime-type 你的测试文件名
正常输出示例:
test_file1: image/jpeg
test_file2: video/mp4
第二步:批量重命名(仅处理当前目录,不递归子目录)
直接执行以下单行脚本即可:
for f in *; do # 跳过非普通文件、已有扩展名的文件 [ -f "$f" ] && [[ "$f" != *.* ]] || continue mime=$(file --brief --mime-type "$f") case "$mime" in image/jpeg) mv -v "$f" "${f}.jpg" ;; video/mp4) mv -v "$f" "${f}.mp4" ;; *) echo "跳过未识别类型文件: $f (MIME: $mime)" ;; esac done
参数说明:
--brief:直接返回MIME字符串,省略输出前缀的文件名,方便匹配-v:打印重命名日志,方便后续核对
如果需要递归处理所有子目录下的无后缀文件,用以下兼容特殊文件名的脚本:
find . -type f ! -name "*.*" -print0 | while IFS= read -r -d '' f; do mime=$(file --brief --mime-type "$f") case "$mime" in image/jpeg) mv -v "$f" "${f}.jpg" ;; video/mp4) mv -v "$f" "${f}.mp4" ;; *) echo "跳过未识别类型文件: $f (MIME: $mime)" ;; esac done
说明:find的-print0和read的-d ''配合,完美兼容文件名带空格、换行等特殊字符的场景。
注意事项
执行前建议先备份文件,或者先把命令里的mv -v替换成echo mv -v模拟执行,确认输出的重命名操作符合预期后,再去掉echo实际执行。
内容的提问来源于stack exchange,提问作者Jaeger
相关产品推荐
相关产品推荐

