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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:18:00