file 是做什么的
file 通过读取文件头部的魔数(magic)以及内置启发式规则判断文件类型,不依赖扩展名,因此对改过名的文件同样有效。规则库在 Linux 上通常位于 /usr/share/misc/magic.mgc,能识别文本、脚本、ELF 可执行文件、各类压缩包与文档格式。它还能读出 ELF 二进制的目标架构(x86-64、ARM aarch64、LoongArch 等)与链接方式,是跨平台交付核对产物架构的第一道检查。
基本信息
| 适用平台 | Linux 全发行版(麒麟、UOS、openEuler 均自带) |
|---|---|
| 语法 | file [选项] 文件或目录 |
| 常用选项 | -i 输出 MIME 类型;-L 跟随符号链接;-b 只输出结论;-k 不因首个匹配停止 |
| 权限要求 | 能读取目标文件即可,普通用户可执行 |
| 依赖 | magic 规则库,缺失或过期时输出会退化成 data |
典型使用场景
- 拿到来源不明的文件时先确认类型,再决定用什么工具打开,避免直接用错程序
- 脚本跨系统传递后排错:输出里的 CRLF 提示能直接解释 bad interpreter 一类报错
- 跨架构交付核对:把编译产物拷到鲲鹏、飞腾、龙芯机器前先比对架构,避免现场才报格式错误
- 区分压缩包与容器格式:gzip、xz、zip、tar 的处理命令不同,先看清楚再动手
- 判断可执行文件是动态链接还是静态链接,评估目标机的依赖库与 libc 版本兼容性
- 配合 find 与管道做批量类型统计,快速发现构建产物里混入的异常文件
典型用法
典型用法
file /usr/bin/ls # 查看系统二进制的类型与架构
file -i ./upload.bin # 用 MIME 类型做脚本分支判断
file -b ./notes.txt # 只输出结论,便于切分字段
file -L /usr/bin/python3 # 跟随符号链接看真实目标类型
file ./app-binary | grep -qE 'x86-64|aarch64' # 脚本里校验产物架构
file -k ./image.bin # 不因首个匹配停止,列出更多候选
file ./scripts/deploy.sh # 顺带检查是否带 CRLF 换行常见输出判读
| 输出片段 | 含义 | 判读要点 |
|---|---|---|
| ELF 64-bit LSB executable, x86-64 | x86-64 架构可执行文件 | 拷到 ARM 机器上无法直接运行 |
| ELF 64-bit LSB executable, ARM aarch64 | ARM 64 位可执行文件 | 适用于鲲鹏、飞腾整机 |
| ASCII text executable | 纯文本且带可执行位 | 跑不起来多为解释器或权限问题 |
| ASCII text, with CRLF line terminators | 带 Windows 换行符 | shell 脚本会因回车符报错,需转换 |
| ELF ... dynamically linked | 动态链接 | 需确认目标机依赖库版本 |
| symbolic link to ... | 符号链接 | 需加 -L 才能看到目标类型 |
file 只读文件头部特征、不执行文件,用它判断可疑文件比直接运行安全;但结论属于启发式判断,遇到自解压程序或加密容器可能只报 data,此时可加 -k 查看更多候选类型。
需要更细的架构与依赖信息时配合 readelf -h 看 ELF 头、ldd 看动态依赖;若 ldd 提示 not a dynamic executable,则说明该二进制是静态链接的。