file -i 输出带 charset 是因其等价于 file --mime-type --mime-encoding,自动拼接为“类型; charset=编码”格式;需纯类型时应使用 file --mime-type,需纯编码时用 file --mime-encoding。
直接用 file -i 或 file --mime-type 就能拿到准确的 MIME 类型,但要注意默认输出包含编码信息,真要纯类型得加 --mime-type 单独取值。
为什么 file -i 输出里带 charset=...?
file -i 实际等价于 file --mime-type --mime-encoding,所以会拼出类似 text/plain; charset=utf-8 这样的完整字符串。这在 Web 服务或脚本里有时多余——比如你只关心是不是 image/jpeg,不想处理分号后的内容。
- 要纯类型(不含编码):用
file --mime-type 文件名 - 要纯编码(不含类型):用
file --mime-encoding 文件名 - 想一行里同时看两者但自己控制格式:用
file -i+cut -d';' -f1切分
file --mime-type 和 file -i 在脚本里怎么选?
关键看下游工具是否接受完整 MIME 字符串。比如 curl -H "Content-Type: $(file -i -b file.jpg)" 可能失败,因为 -b 不影响 -i 的拼接逻辑,依然带 charset;而 curl 通常只要类型部分。
- 给
curl、wget或 HTTP API 传类型:优先file --mime-type -b 文件名(-b去掉文件名前缀,--mime-type去掉编码) - 做类型判断分支(如
if [[ "$(file --mime-type -b f)" == "application/pdf" ]]):必须用--mime-type,-i会因编码差异导致匹配失败 - 调试时快速扫一眼:
file -i最省事,信息全
压缩包里的文件也能查 MIME 类型吗?
可以,但得加 -z 参数,否则 file 默认只报外层是 application/x-gzip 这类容器类型。
Trae linux
Trae Linux 官方版本现已全面上线,开发者可直接访问 Trae 官网(trae.cn 国内版或 trae.ai 国际版)获取专属安装包。该版本完美适配主流 Linux 发行版,提供 .deb(适配 Ubuntu/Debian)、.rpm(适配 RHEL/Fedora)以及通用 .tar.gz 格式,并全面支持 x64 与 ARM64 架构。
- 查
archive.tar.gz本身类型:file --mime-type archive.tar.gz→application/gzip - 查它解压后第一个文件的类型:
file -z --mime-type archive.tar.gz→text/x-shellscript(如果里面是 shell 脚本) -
-z对.zip、.bz2、.xz都有效,但对加密压缩包或损坏包可能返回data
符号链接会影响 MIME 类型识别结果吗?
默认会跟随(-L 是默认行为),所以 file --mime-type link.sh 实际检查的是它指向的文件。如果你明确想确认链接本身的属性(比如链接是否损坏、指向是否合法),得加 -h。
- 查真实内容类型(推荐日常用):
file --mime-type link.sh - 查链接文件自身(元数据):
file -h --mime-type link.sh→ 输出inode/symlink - 注意:
-h和-L互斥,-L是默认,不用显式写
真正容易被忽略的是 --mime-type 和 --mime-encoding 的分离设计——很多人卡在正则匹配失败,其实只是没意识到 -i 拼出来的字符串结构不干净。