file 指令:識別任何檔案類型 文章首圖

file 指令:識別任何檔案類型

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-8ascii,通常代表它是純文字檔;若顯示 binary,則為二進位檔。

常見問題與解決方案

Q1: file 顯示 "data" 或 "empty" 怎麼辦?

file 無法識別檔案內容時,它可能會返回 dataempty。這通常發生在:

  1. 檔案為空:檢查檔案大小是否為 0。
  2. 非標準格式:檔案內容不符合常見魔數規則。
  3. 權限問題:雖然較少見,但若沒有讀取權限,file 可能無法讀取檔案頭部。

解決方案: 使用 hexdumpxxd 查看檔案頭部位元組,手動判斷。

xxd -l 16 unknown_file

Q2: 如何判斷檔案的編碼方式(Encoding)?

file 主要識別檔案結構,對文字編碼(如 UTF-8, ISO-8859-1)的判斷有時不準確,特別是對於 ASCII 相容的內容。

解決方案: 對於文字檔,建議使用 encachardet 等專門工具,或結合 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 看看它的真面目吧!