file 是什么
file 通过读取文件开头的魔法字节(magic number)来判断真实类型,而不是看扩展名。它的规则库来自 libmagic,覆盖面很广:文本文件能进一步区分编码(ASCII、UTF-8、ISO-8859),可执行文件能报出架构与链接方式,压缩包与归档格式也能识别。收到来源不明的文件、怀疑扩展名被改过、或不确定某个二进制是不是给错了 CPU 架构时,先用它验明正身。
基本信息
| 用途 | 识别文件的真实类型、编码与可执行文件架构 |
|---|---|
| 语法 | file [选项] 文件...(可一次传多个文件或目录) |
| 所属软件包 | file(规则来自 libmagic,各发行版默认安装) |
| 常用选项 | -i 输出 MIME 与字符集、-b 只输出描述、-z 继续看压缩包内部、-f 从文件读入待检列表 |
典型使用场景
- 验身来源不明的文件:先确认它到底是文本、二进制还是压缩包,再决定怎么处理
- 怀疑扩展名被改:upload.jpg 实际是可执行文件这类情况,用 file 一眼看穿
- 架构核对:部署二进制前确认是 x86-64 还是 aarch64,避免上机才报格式错误
- 编码确认:脚本报语法错误、中文乱码时,先确认文件是 UTF-8 还是其它编码
- 批量归档前分类:对一批文件输出 MIME,便于按类型分流处理
常用示例
常用示例
file backup.dat # 最基本的判断
file -i upload.bin # 输出 MIME 类型与字符集
file -b mystery # 只要描述,便于脚本消费
file /bin/ls /usr/local/bin/app # 确认架构与链接方式
file -z archive.gz # 顺着压缩包看内部第一个文件
find /data/inbox -type f -print0 | xargs -0 -r file -b | sort | uniq -c | sort -rn常见输出含义
| 输出片段 | 含义 | 怎么用 |
|---|---|---|
| ASCII text | 纯 ASCII 文本 | 可以直接用文本工具处理 |
| UTF-8 Unicode text | UTF-8 文本 | 中文文件正常形态 |
| ISO-8859 text | 单字节西欧编码 | 中文环境常需转码后再读 |
| ELF 64-bit LSB executable, x86-64 | 64 位 x86 可执行文件 | 确认与目标机器架构一致 |
| ELF 64-bit LSB shared object | 共享库 | 被程序加载的 .so 文件 |
| gzip compressed data | gzip 压缩数据 | 用 zcat 或 gunzip 读取 |
| data | 未识别的二进制 | 配合 xxd 或 od 看头部字节再判断 |
| empty | 空文件 | 注意是否为异常中断产生的空产物 |
file -i 给出的 charset 也可能是 unknown-8bit,表示它按二进制处理。遇到这种情况先别急着当成损坏,可能只是格式较新或规则库偏旧,用 xxd 看头几个字节往往能更快定性。
file 只读头部字节,被截断或刻意伪造头部的文件会被误判。对安全相关的重要文件,类型判断之后还要配合 sha256sum 校验摘要,两者结合才有意义。