Files

如果不是來自文件後綴,如何知道文件類型?

  • November 10, 2020

如果文件名沒有後綴,我想知道如何知道文件類型。

例如,一個文件名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 OS
  • 15( \025) 將是 IBM 的 AIX

現在語言測試開始了。如果它看起來是一個文本文件,則在該文件中搜尋特定字元串以找出它包含的語言(C、Perl、Bash)。某些腳本語言也可以通過腳本第一行中的hashbang ( ) 來辨識。#!/bin/interpreter

如果文件沒有任何內容,則無法確定文件類型,file只列印“數據”。

因此,您會看到不需要後綴。無論如何,如果設置錯誤,後綴可能會造成混淆。

引用自:https://unix.stackexchange.com/questions/207276