file 指令:識別任何檔案類型
在 Linux 系統管理的日常工作中,我們經常會面對一堆來源複雜的檔案:可能是從網頁下載的未知壓縮包、從舊系統遷移的資料夾,或是透過 SSH 傳輸過來的日誌檔。這些檔案通常沒有擴充名,或者擴充名與實際內容不符(例如將 .jpg 圖片錯誤標記為 .txt)。此時,file 指令就是我們最強大的偵測工具。它不僅能告訴我們檔案是什麼類型,還能揭示其編碼方式、壓縮格式甚至位元組順序。
本文將深入解析 file 指令的核心用法,幫助你快速掌握檔案本質。
基礎用法與輸出解析
file 指令的基本語法非常簡單,只需指定檔案路徑即可。它會透過檢查檔案的「魔數」(Magic Numbers,即檔案開頭的特殊位元組序列)來判斷類型。
假設我們有一個名為 unknown_file 的檔案,執行以下指令:
file unknown_file
輸出結果可能如下:
unknown_file: POSIX shell script, ASCII text executable
這表示該檔案是一個 POSIX 相容的 Shell 腳本,且內容為純文字。
若檔案是二進位檔案,輸出會更詳細:
file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, 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 位元、執行架構為 x86-64,以及是否為動態連結等。這對於除錯或安全審查非常有幫助。
常用選項解析
除了基本用法,file 提供了多個實用的選項來應對不同情境。
1. 顯示詳細資訊:-v 或 --verbose
當你需要知道檔案的 MIME 類型(Multipurpose Internet Mail Extensions)時,可以使用 -i 選項。這在撰寫腳本或 Web 開發時特別有用,因為 MIME 類型是標準化的。
file -i photo.jpg
photo.jpg: image/jpeg; charset=binary
2. 壓縮檔案內容偵測:-z
file 可以深入壓縮檔案內部,識別被壓縮的內容。例如,一個 .tar.gz 檔案,如果不加選項,它只會告訴你這是 gzip 壓縮資料。加上 -z 後,它會嘗試解壓縮並識別內部檔案。
file archive.tar.gz
archive.tar.gz: gzip compressed data, was "archive.tar", last modified: ..., from Unix
file -z archive.tar.gz
archive.tar.gz: POSIX tar archive (GNU), author: user, ...
3. 只顯示 MIME 類型:-i
在自動化腳本中,我們通常只需要 MIME 類型字串。
file --mime-type document.pdf
document.pdf: application/pdf
實際應用範例
範例一:批量識別目錄中的檔案類型
當你在一個混雜了圖片、腳本和二進位檔的目錄中時,可以使用 file 搭配 grep 來過濾特定類型的檔案。
# 找出所有圖片檔案(包含各種格式)
file * | grep -i image
輸出範例:
logo.png: PNG image data, 100 x 100, 8-bit/color RGBA, non-interlaced
banner.jpg: JPEG image data, JFIF standard 1.01
範例二:檢查檔案是否為文字檔
在處理從 Windows 傳來的檔案時,經常會遇到換行符號問題(CR/LF vs LF)。file 可以幫助我們確認檔案編碼。
file --mime-encoding windows_script.bat
windows_script.bat: us-ascii
如果輸出顯示 utf-8 或 ascii,通常代表它是純文字檔;若顯示 binary,則為二進位檔。
常見問題與解決方案
Q1: file 顯示 "data" 或 "empty" 怎麼辦?
當 file 無法識別檔案內容時,它可能會返回 data 或 empty。這通常發生在:
- 檔案為空:檢查檔案大小是否為 0。
- 非標準格式:檔案內容不符合常見魔數規則。
- 權限問題:雖然較少見,但若沒有讀取權限,
file可能無法讀取檔案頭部。
解決方案:
使用 hexdump 或 xxd 查看檔案頭部位元組,手動判斷。
xxd -l 16 unknown_file
Q2: 如何判斷檔案的編碼方式(Encoding)?
file 主要識別檔案結構,對文字編碼(如 UTF-8, ISO-8859-1)的判斷有時不準確,特別是對於 ASCII 相容的內容。
解決方案:
對於文字檔,建議使用 enca 或 chardet 等專門工具,或結合 file -i 的 MIME 資訊進行綜合判斷。
# 安裝 chardet
sudo apt install python3-chardet
# 使用 python 腳本偵測編碼
python3 -c "import chardet; print(chardet.detect(open('file.txt', 'rb').read()))"
小結
file 指令雖然簡單,卻是 Linux 系統管理員的得力助手。它透過檢查檔案魔數,提供了快速、準確的檔案類型識別功能。掌握 -i、-z 等選項,並理解其輸出結果的含義,能讓你在處理檔案傳輸、除錯和安全審查時更加得心應手。下次遇到不明檔案時,別急著打開它,先用 file 看看它的真面目吧!