在Linux中检查文件类型

在Linux中检查文件类型,linux,shell,Linux,Shell,我想检查某些文件,看看它们的类型和扩展名是否匹配。我目前正在使用file命令检查mime类型(或file的基本输出),并将其与文件扩展名进行比较。但是,某些文件类型返回相同的mime类型,例如.sfx和.dll 此外,我还有一些根本没有扩展名的文件,我应该能够正确地确定它们的文件类型 我希望能够正确地获得所有文件类型,但我目前感兴趣的最重要的文件类型是 动态链接库 微星 com cpl exe ocx tmp upd 是否有其他工具可以检查并返回文件的类型 编辑 我编写了一个nodejs脚本

我想检查某些文件,看看它们的类型和扩展名是否匹配。我目前正在使用file命令检查mime类型(或file的基本输出),并将其与文件扩展名进行比较。但是,某些文件类型返回相同的mime类型,例如.sfx.dll

此外,我还有一些根本没有扩展名的文件,我应该能够正确地确定它们的文件类型

我希望能够正确地获得所有文件类型,但我目前感兴趣的最重要的文件类型是

  • 动态链接库
  • 微星
  • com
  • cpl
  • exe
  • ocx
  • tmp
  • upd
是否有其他工具可以检查并返回文件的类型

编辑

我编写了一个nodejs脚本,可以用作linux命令。我通过合并公共数据库创建了自己的文件签名数据库,每个文件扩展名的格式如下:

"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
命令。我现在看到python
magic
file
都使用
libmagic
,所以不应该有区别。现在我对这个问题感到困惑,因为python magic在我的系统上对DLL和EXE的报告不同:“PE32可执行文件(DLL)(控制台)英特尔80386 Mono/.Net汇编,用于MS Windows”