我想检查某些文件,看看它们的类型和扩展名是否匹配。我目前正在做的是使用文件命令检查mime类型(或文件的基本输出)并将其与文件扩展名进行比较。但是,某些文件类型会返回相同的mime类型,例如 .sfx 和 .dll 。
我也有一些没有扩展名的文件,我应该能够正确地确定它们的文件类型。
我希望能够正确获取所有文件类型,但我目前感兴趣的最重要的文件类型是;
是否有其他工具可以检查并返回文件的类型?
修改
我写了一个可以用作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,我会检查我的数据库中针对给定文件的每个扩展名的所有签名字节序列,看看它们是否匹配。如果我有匹配,我会返回结果。
如果我找不到匹配项,我执行文件命令,获取文件的mime-type,并使用另一个我创建的db来匹配带扩展名的mime-types,看看是否有比赛。 mime-type db的格式是这样的;
"application/atom+xml": [
"atom",
"xml"
],
"application/atomcat+xml": [
"atomcat"
],
"application/atomsvc+xml": [
"atomsvc"
]
此解决方案目前符合我项目的需求。也许这可能会帮助别人。
答案 0 :(得分:0)
在pip install filemagic
之后使用Python:
>>> 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'
答案 1 :(得分:0)
Linux有一个内置的file
命令:man file
Windows和* nix之间的主要区别在于DOS / Windows在文件后缀上有内置依赖项。例如,可执行文件必须命名为" .exe" (或.com);一个.bat文件必须命名为" .bat" (或.cmd)。
Linux,MacOS,BSD等没有这样的限制。相反,他们必须执行"执行"权限设置,以便"可运行"。对于二进制可执行文件(例如编译代码)或脚本(例如Python,Perl ...或shell脚本)都是如此。
而不仅仅依赖于文件后缀,"文件"命令还会查看自我识别"魔术数字"或其他"标题信息"在文件本身。
建议:
如果内置"文件"不能满足你的需求;也许你可以把它包装在一个shell脚本中:
1)检查某些"众所周知的后缀" (使用basename提取后缀)和/或
2)通话"文件"作为后备