在Linux中检查文件类型
我想检查某些文件,看看它们的类型和扩展名是否匹配。我目前正在使用file命令检查mime类型(或file的基本输出),并将其与文件扩展名进行比较。但是,某些文件类型返回相同的mime类型,例如.sfx和.dll 此外,我还有一些根本没有扩展名的文件,我应该能够正确地确定它们的文件类型 我希望能够正确地获得所有文件类型,但我目前感兴趣的最重要的文件类型是在Linux中检查文件类型,linux,shell,Linux,Shell,我想检查某些文件,看看它们的类型和扩展名是否匹配。我目前正在使用file命令检查mime类型(或file的基本输出),并将其与文件扩展名进行比较。但是,某些文件类型返回相同的mime类型,例如.sfx和.dll 此外,我还有一些根本没有扩展名的文件,我应该能够正确地确定它们的文件类型 我希望能够正确地获得所有文件类型,但我目前感兴趣的最重要的文件类型是 动态链接库 微星 com cpl exe ocx tmp upd 是否有其他工具可以检查并返回文件的类型 编辑 我编写了一个nodejs脚本
- 动态链接库
- 微星
- com
- cpl
- exe
- ocx
- tmp
- upd
"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 will result.iso),然后检查该文件的签名字节,看看它是否真的是一个iso文件。如果它确实是iso,则返回iso作为结果
如果不是iso,我将检查数据库中每个扩展名的所有签名字节序列,并与给定文件进行比较,以查看它们是否匹配。如果有匹配项,则返回结果
如果找不到匹配项,则执行file命令,获取文件的mime类型,并使用为匹配mime类型和扩展名而创建的另一个db,以查看是否有匹配项。mime类型db的格式如下:
"application/atom+xml": [
"atom",
"xml"
],
"application/atomcat+xml": [
"atomcat"
],
"application/atomsvc+xml": [
"atomsvc"
]
此解决方案目前满足我的项目需要。也许这对其他人也有帮助。在pip安装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'
在
pip安装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'
Linux有一个内置的
文件
命令:
Windows和*nix之间的主要区别在于DOS/Windows对文件后缀具有内置依赖性。例如,可执行文件必须命名为“.exe”(或.com);.bat文件必须命名为“.bat”(或.cmd)
Linux、MacOS、BSD等没有此类限制。相反,它们必须设置“执行”权限才能“运行”。对于二进制可执行文件(如编译代码)或脚本(如Python、Perl…或shell脚本),都是如此
“file”命令不仅依赖于文件后缀,“file”命令还查看文件本身中的自识别“幻数”或其他“头信息”
建议:
如果内置的“文件”不能满足您的需要;也许您可以将其包装在一个shell脚本中:
1) 检查某些“已知后缀”(用于提取后缀),和/或
2) 调用“file”作为回退Linux有一个内置的
文件
命令:
Windows和*nix之间的主要区别在于DOS/Windows对文件后缀具有内置依赖性。例如,可执行文件必须命名为“.exe”(或.com);.bat文件必须命名为“.bat”(或.cmd)
Linux、MacOS、BSD等没有此类限制。相反,它们必须设置“执行”权限才能“运行”。对于二进制可执行文件(如编译代码)或脚本(如Python、Perl…或shell脚本),都是如此
“file”命令不仅依赖于文件后缀,“file”命令还查看文件本身中的自识别“幻数”或其他“头信息”
建议:
如果内置的“文件”不能满足您的需要;也许您可以将其包装在一个shell脚本中:
1) 检查某些“已知后缀”(用于提取后缀),和/或
2) 调用“file”作为回退您只能使用文件扩展名作为提示,文件扩展名不必正确。此外,可用的三个字母组合只有这么多,许多字母组合必须用于不同类型的文件。或者扩展名
.dat
?对于所有类型的数据文件,这是一个非常常见的扩展名,几乎没有相似的扩展名。对于您列出的文件,这些文件应该具有非常独特的签名。这些类型的前几个字节应该是唯一的;不信任文件扩展名本身。您的方向是正确的。您拥有的大多数文件类型列表都是众所周知的。对于那些文件
无法区分的文件,您可以在/etc/magic
中更新/添加感兴趣的文件类型的签名/标题。您只能使用文件扩展名作为提示,文件扩展名不必正确。此外,可用的三个字母组合只有这么多,许多字母组合必须用于不同类型的文件。或者扩展名.dat
?对于所有类型的数据文件,这是一个非常常见的扩展名,几乎没有相似的扩展名。对于您列出的文件,这些文件应该具有非常独特的签名。这些类型的前几个字节应该是唯一的;不信任文件扩展名本身。您的方向是正确的。您拥有的大多数文件类型列表都是众所周知的。对于那些文件
无法区分的,您可以在/etc/magic
中更新/添加感兴趣的文件类型的签名/标题。OP在问题的第一段提到了file
命令。OP在问题的第一段提到了file
命令。我现在看到pythonmagic
和file
都使用libmagic
,所以不应该有区别。现在我对这个问题感到困惑,因为python magic在我的系统上对DLL和EXE的报告不同:“PE32可执行文件(DLL)(控制台)英特尔80386 Mono/.Net汇编,用于MS Windows”