Linux 不依賴擴展名判斷文件類型,file 命令通過讀取文件魔數、元數據、文本特徵,精準識別文件真實身份。本文詳解 file 工作原理、輸出解讀、常用參數、批量識別、腳本集成、魔數數據庫 (/etc/magic) 定製。
stat() 獲取 inode 信息,判斷是否為目錄、字符/塊設備、FIFO、Socket、符號鏈接。/etc/magic / /usr/share/misc/magic.mgc 中定義的特征碼 (偏移量、類型、值、掩碼、描述)。如 ELF (0x7F 'E' 'L' 'F')、PNG (0x89 'P' 'N' 'G')、ZIP (PK\\x03\\x04)。#!/bin/bash、XML 聲明、HTML 標簽) 判斷腳本/文本類型。
file filename
file /path/to/file
file -b filename # 只顯示類型,不顯示文件名
file -z filename # 解壓查看壓縮文件內部類型 (gzip, bzip2, xz)
file -L filename # 跟隨符號鏈接檢測目標文件
file -s /dev/sda1 # 檢測塊設備 (需 root)
file -i filename # 輸出 MIME 類型 (charset)
file -F " | " filename # 自定義分隔符
$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, stripped
# ELF 64-bit LSB shared object → 64位動態鏈接共享對象 (可執行文件/庫)
# x86-64 → 架構
# dynamically linked → 動態鏈接
# stripped → 符號表已剝離
$ file /etc/passwd
/etc/passwd: ASCII text
# 純 ASCII 文本
$ file image.png
image.png: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced
# PNG 圖像、分辨率、色深、非隔行
$ file data.zip
data.zip: Zip archive data, at least v2.0 to extract
# ZIP 壓縮包
$ file /dev/sda
/dev/sda: block special (8/0)
# 塊設備
$ file suspicious.jpg
suspicious.jpg: ELF 64-bit LSB executable, x86-64 ... # 實為可執行程序,非圖片!
$ file backup
backup: gzip compressed data, was "backup.tar", last modified: ...
# 實為 gzip 壓縮的 tar 包
find /var/www -type f -exec file {} + | grep -v "ASCII text\|HTML document\|image\|PHP script"
# 過濾掉常見類型,聚焦可疑二進制/腳本
#!/bin/bash
type=$(file -b --mime-type "$1")
case "$type" in
image/*) convert "$1" -resize 50% "thumb_$1" ;;
application/pdf) pdftotext "$1" "${1%.pdf}.txt" ;;
text/*) iconv -f GBK -t UTF-8 "$1" -o "${1%.txt}.utf8.txt" ;;
*) echo "Unsupported: $type" ;;
esac
file /usr/lib/libfoo.so
# /usr/lib/libfoo.so: ELF 64-bit LSB shared object, x86-64 ... 確認為共享庫
ldd /usr/lib/libfoo.so # 查看依賴
/etc/magic (文本) → file -C 編譯 → /usr/share/misc/magic.mgc (二進制緩存)。
# /etc/magic 追加自定義類型
0 string MYAPP_MAGIC MyApp Data File
>:4 string >\0 Version %s
# 格式: 偏移 類型 匹配值 描述
# > 表示繼續上一行偏移
file -C -m /etc/magic # 編譯
file -m /etc/magic.mgc myapp.dat # 使用自定義魔數
data。用 file -i 獲取 MIME + charset 輔助判斷。-z 參數查看內部類型。-L 跟隨檢測目標。file -s /dev/sda 需讀取設備元數據。file 是 Linux 系統管理、安全審計、腳本自動化、數據恢復中「識別文件真實身份」的權威工具。掌握 -b -i -z -L -s 參數組合、魔數原理、批量掃描模式、自定義魔數擴展,能讓你在面對「不知名文件」時從容鑑定、精準處理。
