file命令通过魔数、结构解析和元数据多层检测识别文件真实类型,不依赖后缀名;支持-z解压检测、-L跟踪链接等选项,并提供空目录、隐藏文件及批量处理的实用技巧。

file命令能准确识别无后缀名文件的真实类型,因为它不看文件名,而是直接读取文件开头的字节特征(魔数)和内部结构。
靠魔数而非扩展名判断
Linux系统本身不依赖后缀识别文件。file命令会检查文件头部固定位置的字节序列——比如JPEG以FF D8 FF开头、PNG以89 50 4E 47开头、ELF可执行文件以7F 45 4C 46开头。这些“魔数”是格式规范强制定义的,改名或删后缀完全不影响识别结果。
- 即使把一个PDF重命名为
report(无后缀),file report仍输出“PDF document, version 1.7” - 把shell脚本改成
deploy,只要内容含#!/bin/bash,file就能识别为“Bourne-Again shell script” - 对纯文本文件,file还会进一步分析编码(如UTF-8、ISO-8859-1)和语言特征(是否含C代码、HTML标签等)
支持多层检测机制
当魔数匹配失败时,file不会直接放弃,而是进入二级分析:
- 尝试解析文件结构:比如检查tar归档的块对齐、ZIP的中央目录偏移
- 对文本类文件,扫描内容特征:是否存在XML声明、JSON大括号、Python缩进语法
- 对设备文件、符号链接等特殊类型,调用
stat()获取inode元数据,确认是字符设备、套接字还是管道
应对常见干扰场景
遇到压缩包、加密文件或自定义二进制格式时,file提供针对性选项:
- 加
-z参数:自动解压gzip/bzip2/xz后再检测内部真实类型(如file -z archive.tar.gz返回“POSIX tar archive”) - 加
-L参数:跟随符号链接,检测目标文件而非链接本身 - 对无法识别的文件,先用
hexdump -C -n 32 文件名查看前32字节,再对照/usr/share/file/magic规则库手动比对
实用技巧提升识别可靠性
避免默认行为带来的遗漏或误判:
- 空目录下运行
file *会报错,提前执行shopt -s nullglob让通配符不展开为空 - 隐藏文件(如
.env)需显式包含:file .[^.]* *或用find . -maxdepth 1 -type f -exec file {} \; - 批量处理时优先用
-b(精简输出)和-i(MIME格式),便于脚本解析,例如file -b --mime-type *.log直接输出text/plain之类


















