脚本中应使用 file -b --mime-type 提取纯净 mime 类型,如 application/pdf;漏掉 -b 会带文件名前缀,-i 输出含 charset= 不适配自动解析。

脚本里用 file -b --mime-type 提取纯净 MIME 类型
直接解析 file -i 输出会多出文件名和分号分隔的 charset=...,不适合脚本自动判断。必须用 -b 去掉前缀、--mime-type 只取类型部分:
-
file -b --mime-type document.pdf→ 输出application/pdf(干净可比对) - 漏掉
-b:输出document.pdf: application/pdf,得额外用cut -d' ' -f2切割,易错 - 脚本中建议加
2>/dev/null屏蔽 file 找不到文件或权限不足时的报错,避免中断流程
遇到 application/octet-stream 或 data 怎么办
这不是 bug,是魔数没匹配上——文件可能被截断、加密、自定义格式,或根本不是标准格式。别硬猜 MIME,转头看原始字节:
- 用
head -c 32 "$file" | hexdump -C查前 32 字节十六进制 - 对照常见魔数:ELF 是
7f 45 4c 46,PNG 是89 50 4e 47,JPEG 是ff d8 ff - 如果是压缩包但没解压识别,加
-z:file -b --mime-type -z archive.zip
批量处理时通配符漏掉隐藏文件
file -b --mime-type * 默认跳过 .env、.gitignore 这类点开头的文件,导致误判率上升:
- bash/zsh 下可用
file -b --mime-type .[^.]* *覆盖大部分隐藏文件(注意顺序,避免空匹配) - 更稳妥用
find . -maxdepth 1 -type f -exec file -b --mime-type {} \; - 空目录下
*会展开失败,加shopt -s nullglob防止报file: cannot open `*'
自己写 C 程序调用 libmagic 更可控
shell 脚本调 file 进程开销大、启动慢,高频判断(如 Web 上传校验)建议嵌入式调用 libmagic:
- 关键 API 就四个:
magic_open、magic_load、magic_file、magic_close - 数据库路径必须显式指定,比如
/usr/share/file/magic.mgc,不能只传空字符串 -
magic_file()返回的是 const char*,别直接free();需用magic_error()检查是否加载失败
真正容易被忽略的是魔数规则库的时效性——/usr/share/file/magic.mgc 不会自动更新,新格式(比如某些 AI 模型权重文件)可能识别为 application/octet-stream,这时要么升级 file 包,要么自己往 /usr/share/misc/magic 里追加规则。











