2015-11-18 56 views
1

我想檢查某些文件並查看它們的類型和擴展名是否匹配。我目前所做的是使用文件命令來檢查MIME類型(或文件的基本輸出)並將其與文件擴展名進行比較。但是,某些文件類型返回相同的MIME類型,例如.sfx.dll在Linux中檢查文件類型

另外我有一些文件沒有擴展在所有,我應該能夠正確地確定它們的文件類型。

我希望能夠正確地獲取所有文件類型,但是我目前感興趣的最重要的文件類型是;

  • DLL
  • 微星
  • COM
  • CPL
  • EXE
  • OCX
  • TMP
  • UPD

是否有任何其他檢查並返回文件類型的工具?

編輯

我寫的,可以用來作爲Linux命令腳本的NodeJS。我通過合併公共數據庫創建了我自己的文件簽名數據庫,對於每個文件擴展名都有以下格式;

"ISO" : [ 
    { 
     "signature": "4344303031", // byte sequence 
     "size": 5, // size of byte sequence 
     "offset": 32769 // offset in the file for the signature bytes 
    }, 
    { 
     "signature": "4344303031", 
     "size": 5, 
     "offset": 34817 
    }, 
    { 
     "signature": "4344303031", 
     "size": 5, 
     "offset": 36865 
    } 
] 

現在;我首先檢查文件名中可用擴展名的簽名字節(text.iso將導致.iso),然後我去檢查該文件的簽名字節,看看它是否真的是一個iso文件。如果它確實是iso,作爲結果返回iso。

如果它不是iso,我檢查每個擴展的所有簽名字節序​​列,我在我的db中針對給定文件查看它們是否匹配。如果我有一場比賽,我會返回結果。

如果我找不到匹配項,我執行文件命令,獲取文件的MIME類型,並使用創建的另一個數據庫將MIME類型與擴展名匹配,以查看它是否匹配。 MIME類型數據庫的格式如下所示;

"application/atom+xml": [ 
    "atom", 
    "xml" 
], 
"application/atomcat+xml": [ 
    "atomcat" 
], 
"application/atomsvc+xml": [ 
    "atomsvc" 
] 

該解決方案當前滿足我的項目需求。也許這可能會幫助別人。

+0

只能將文件擴展名用作*提示*,文件擴展名不一定正確。此外,只有這麼多的三字母組合可用,許多必須重新用於不同類型的文件。或者如何擴展'.dat'?對於所有類型的數據文件來說,這是一個非常常見的擴展,很少有類似的擴展。 –

+0

至於你列出的文件,那些應該有非常獨特的簽名。這些類型的第幾個字節應該是非常獨特的。 –

+0

這正是我試圖確定文件類型的原因;不信任文件擴展名本身。 – feluna

回答

0

使用Python後pip install filemagic

>>> import magic 
>>> with magic.Magic() as m: m.id_filename('tmp.py') 
... 
'Python script, ASCII text executable' 
>>> with magic.Magic() as m: m.id_filename('test.html') 
... 
'HTML document, ASCII text' 
+2

這是否會執行'file'命令不執行的任何操作? –

+0

我現在看到python'magic'和'file'都使用'libmagic',所以不應該有差異。現在我對這個問題感到困惑,因爲我的系統上的DLL和EXE的Python魔術報告有所不同:'PE32可執行文件(DLL)(控制檯)Intel 80386 Mono/.Net程序集,用於MS Windows'和'PE32可執行文件(控制檯)Intel 80386 ,對於MS Windows', - 但'文件'也報告了這些差異。 –

0

Linux有一個內置的file命令:man file

Windows和Linux之間的主要區別* nix的是DOS/Windows有內置依賴在文件後綴上。例如,可執行文件必須將命名爲「.exe」(或.com); .bat文件必須將命名爲「.bat」(或.cmd)。

Linux,MacOS,BSD等沒有這樣的限制。相反,他們必須具有「執行」權限才能「可運行」。對於二進制可執行文件(例如編譯代碼)或腳本(例如Python,Perl ...或shell腳本)來說都是如此。

「文件」命令不僅僅依賴文件後綴,還會在文件本身中查看自我識別的「幻數」或其他「標題信息」。

建議:

如果內置的「文件」不符合您的需求;或許你可以在一個shell腳本包裝它是:

1)檢查一定的「衆所周知的後綴」(使用basename提取後綴),和/或

2)調用「文件」作爲備用

+1

OP在問題的第一段提到了'file'命令。 –