“file”命令 man 文档中命名的“编译的魔法文件”有什么用?

“file”命令 man 文档中命名的“编译的魔法文件”有什么用?

阅读有关 Linux 文件命令的文档。我在魔法测试描述中发现了这一点:

Any file with some invariant identifier at a small fixed offset into the file
can usually be described in this way. The information identifying these files
is read from /etc/magic and the compiled magic file /usr/share/misc/magic.mgc,
or the files in the directory /usr/share/misc/magic if the compiled file
does not exist. In addition, if $HOME/.magic.mgc or $HOME/.magic exists,
it will be used in preference to the system magic files.

我可以想象魔法文件是“MagicNumber -> Kind of file”关系的集合。 “文件”程序运行以查找文件类型,并获取文件头。但我不明白为什么:

  • 为什么要编译这个文件?
  • 有什么方法可以创建一个神奇的编译文件以与命令一起使用?
  • 与此类测试和文件相关的命令选项的用法是什么?前任:-C or -m

答案1

  • 为什么要编译这个文件?

我怀疑这是出于性能原因。魔法数据库是不小。 File 需要解析每个人类可读的神奇源文件,构建用于检测文件格式的结构,计算每个模式的强度并据此对所有内容进行排序。这个过程可能会慢得难以忍受,尤其是几十年前(文件自 70 年代以来就已存在)。

我猜他们可以让文件在执行时构建数据库并缓存结果,但考虑到用例,它似乎完全没有必要,很复杂,并且会产生许多其他问题。

  • 有什么方法可以创建一个神奇的编译文件以与命令一起使用?
file -m MAGIC_SOURCE -C

这将创建一个已编译的魔术文件,其基本名称MAGIC_SOURCE和扩展名.mgc与当前工作目录中的相同。

您可以在文件或目录上使用它。避免目录尾部斜杠。

例如,file -m ~/.magic -C将所有~/.magic/*源代码编译成一个.magic.mgc编译文件。

  • 与此类测试和文件相关的命令选项的用法是什么?例如:-C-m

-C告诉 file 编译一些源文件。

-m告诉文件要使用哪个魔术文件(源文件或编译文件)。您也可以不使用它-C,例如使用任何文件(包括源文件)来检测文件类型。

man file有关该命令的更多信息以及man magic有关神奇源文件语法的更多信息,请参阅 参考资料。

相关内容