file命令是一个强大的文件类型检测工具,主要用于:
file [选项] [文件]...
| 选项 | 说明 |
|---|---|
| -b, --brief | 简洁模式,不显示文件名 |
| -i, --mime | 输出MIME类型字符串 |
| -I, --mime-type | 只输出MIME类型 |
| -L, --dereference | 跟随符号链接 |
| -z, --uncompress | 尝试查看压缩文件的内容 |
| -s, --special-files | 读取特殊文件(设备文件等) |
| -k, --keep-going | 不限制在第一个匹配结果 |
| -F, --separator | 使用指定字符串分隔文件名和结果 |
| -f, --files-from | 从文件读取要检测的文件名列表 |
| -n, --no-buffer | 检查每个文件后立即刷新输出 |
| -N, --no-pad | 不对齐输出结果 |
| -p, --preserve-date | 尝试保持访问时间不变 |
| -r, --raw | 不将不可打印字符转换为转义序列 |
| -v, --version | 显示版本信息 |
| --help | 显示帮助信息 |
file命令通过以下方式识别文件类型:
这些测试规则存储在 /usr/share/misc/magic 或 /etc/magic 文件中。
检测单个文件的类型:
file document.pdf
document.pdf: PDF document, version 1.4
一次检测多个文件的类型:
file image.jpg script.sh data.txt
image.jpg: JPEG image data, JFIF standard 1.01
script.sh: Bourne-Again shell script, ASCII text executable
data.txt: ASCII text
使用 -b 选项只显示文件类型,不显示文件名:
file -b executable
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
使用 -i 选项输出MIME类型:
file -i photo.png
photo.png: image/png; charset=binary
使用 -I 选项只输出MIME类型字符串:
file -I document.docx
document.docx: application/vnd.openxmlformats-officedocument.wordprocessingml.document
使用 -z 选项查看压缩文件内部的内容类型:
file -z archive.tar.gz
archive.tar.gz: gzip compressed data, was "archive.tar", last modified: Sun Jan 1 12:00:00 2023
使用 -s 选项检测设备文件等特殊文件:
file -s /dev/sda1
/dev/sda1: Linux rev 1.0 ext4 filesystem data
使用 -f 选项从文件读取要检测的文件列表:
# 创建包含文件名的列表文件
echo -e "file1.txt\nfile2.jpg\nfile3.pdf" > filelist.txt
# 检测列表中的文件
file -f filelist.txt
使用 -L 选项检测符号链接指向的实际文件:
# 创建符号链接
ln -s /etc/passwd passwd_link
# 不跟随链接(默认)
file passwd_link
passwd_link: symbolic link to /etc/passwd
# 跟随链接
file -L passwd_link
passwd_link: ASCII text
结合find命令批量检测特定类型的文件:
find . -name "*.bin" -exec file {} \;
| 文件类型 | 典型检测结果 |
|---|---|
| 文本文件 | ASCII text, UTF-8 Unicode text |
| Shell脚本 | Bourne-Again shell script, ASCII text executable |
| PDF文档 | PDF document, version 1.4 |
| JPEG图片 | JPEG image data, JFIF standard 1.01 |
| PNG图片 | PNG image data, 800 x 600, 8-bit/color RGB, non-interlaced |
| ELF可执行文件 | ELF 64-bit LSB executable, x86-64, version 1 (SYSV) |
| Zip压缩文件 | Zip archive data, at least v2.0 to extract |
| Gzip压缩文件 | gzip compressed data, was "filename", last modified: ... |
| 空文件 | empty |
| 目录 | directory |
| 符号链接 | symbolic link to 'target' |
检测可疑文件的真实类型:
# 检测伪装成图片的可执行文件
file suspicious_file.jpg
suspicious_file.jpg: ELF 64-bit LSB executable
根据文件类型自动分类文件:
#!/bin/bash
for file in *; do
if [ -f "$file" ]; then
filetype=$(file -b --mime-type "$file")
case "$filetype" in
image/*) mkdir -p images && mv "$file" images/ ;;
text/*) mkdir -p texts && mv "$file" texts/ ;;
application/pdf) mkdir -p pdfs && mv "$file" pdfs/ ;;
esac
fi
done
检测文本文件的编码:
file -i *.txt
file1.txt: text/plain; charset=utf-8
file2.txt: text/plain; charset=iso-8859-1
file3.txt: text/plain; charset=us-ascii
验证下载的文件是否完整且格式正确:
# 下载文件后验证
file downloaded_file
# 期望:与官方描述的文件类型一致
使用自定义的魔术文件规则:
file -m mymagicfile suspicious_data
检测目录及其子目录中的所有文件:
find /path/to/dir -type f -exec file {} +
统计目录中各种文件类型的数量:
find . -type f -exec file -b {} \; | sort | uniq -c | sort -nr
-s 选项读取设备文件时要小心,可能影响系统稳定性-f 选项比多次调用file命令更高效-b 选项可以减少输出数据量,提高处理速度