Files
如果不是來自文件後綴,如何知道文件類型?
如果文件名沒有後綴,我想知道如何知道文件類型。
例如,一個文件名
myfile
可能是二進製或文本開頭,系統如何知道文件是二進制還是文本?
該
file
實用程序通過 3 種方式確定文件類型:首先是文件系統測試:在這些測試中,對文件呼叫stat系列系統呼叫之一。這將返回不同的unix 文件類型:正常文件、目錄、連結、字元設備、塊設備、命名管道或套接字。根據這一點,進行魔術測試。
魔術測試要復雜一些。文件類型由稱為魔術文件的模式數據庫猜測。某些文件類型可以通過讀取文件中特定位置的位或數字來確定(例如二進製文件)。魔術文件包含“魔術數字”來測試文件是否包含它們以及應該列印哪些文本資訊。這些“幻數”可以是 1-4Byte 的值、字元串、日期甚至是正則表達式。通過進一步的測試,可以找到更多資訊。如果是執行檔,附加資訊將是它是否動態連結、剝離或不或架構。有時必須通過多項測試才能真正辨識文件類型。但無論如何,執行多少測試並不重要,它總是只是一個很好的猜測。
以下是一些常見文件類型的文件中的前 8 個字節,可以幫助我們了解這些幻數的樣子:
Hexadecimal ASCII PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|.... JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF ZIP 50 4B 03 04|0A 00 00 00 PK..|.... PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
如果無法通過魔術測試找到文件類型,則該文件似乎是一個文本文件並
file
查找內容的編碼。編碼的區別在於構成每組中可列印文本的不同範圍和字節序列。還研究了換行符,具體取決於它們的 HEX 值:
0A
(\n
) 對 Un*x/Linux/BSD/OSX 終止文件進行分類0D 0A
(\r\n
) 是來自 Microsoft 作業系統的文件0D
(\r
) 在版本 9 之前是 Mac OS15
(\025
) 將是 IBM 的 AIX現在語言測試開始了。如果它看起來是一個文本文件,則在該文件中搜尋特定字元串以找出它包含的語言(C、Perl、Bash)。某些腳本語言也可以通過腳本第一行中的hashbang ( ) 來辨識。
#!/bin/interpreter
如果文件沒有任何內容,則無法確定文件類型,
file
只列印“數據”。因此,您會看到不需要後綴。無論如何,如果設置錯誤,後綴可能會造成混淆。