file(1) 和 libmagic 用于确定 mime 类型的文件在哪里?

file(1) 和 libmagic 用于确定 mime 类型的文件在哪里?

根据man 5 magic

“文件 /usr/share/misc/magic 指定要测试哪些模式、如果发现特定模式要打印什么消息或 MIME 类型,以及要从文件中提取的其他信息。”

因此我去寻找该文件:

$ file /usr/share/misc/magic
/usr/share/misc/magic: symbolic link to `../file/magic'

$ ll /usr/share/file/magic
total 8
drwxr-xr-x 2 root root 4096 2011-08-08 13:52 ./
drwxr-xr-x 3 root root 4096 2011-10-12 07:27 ../

因此,手册页中指定的文件实际上是指向空目录的符号链接。我的 Ubuntu 11.10 系统上的那个文件在哪里?

我想查看它的原因是,命令file --mime和 python magic 模块都为某些文件返回了相同的错误 mime 类型,我想查看该文件的格式,以便我可以负责任地修改相关关联。谢谢。

更新:

感谢 @Caesium 向我指出该strace命令。将该命令的输出通过管道传输到grep magic,我得到了以下输出:

open("/usr/lib/libmagic.so.1", O_RDONLY) = 3
access("/home/phoenix/.magic", R_OK)    = -1 ENOENT (No such file or directory)
open("/etc/magic.mgc", O_RDONLY)        = -1 ENOENT (No such file or directory)
stat("/etc/magic", {st_mode=S_IFREG|0644, st_size=111, ...}) = 0
open("/etc/magic", O_RDONLY)            = 3
open("/usr/share/misc/magic.mgc", O_RDONLY) = 3

因此,似乎file首先在 中查找/home/username/.magic,然后/etc/magic.mgc是 ,然后是/etc/magic,最后是 来/usr/share/misc/magic.mgc确定文件类型。这表明,添加用户特定关联规则的正确位置是在/home/username/.magic,而添加系统范围规则的正确位置是在/etc/magic。我选择了后者。

为了记录在案,以下是我对以下内容的补充/etc/magic

# python: file(1) magic for python modules and scripts
0 string """ a python script text executable
!:mime text/x-python
0 regex #!\ .*\ python a python script text executable
!:mime text/x-python
# pyc file: first four bytes are magic number
# which changes with each python version.
# this is for version 2.7.2:
0 belong 0x03f30d0a python compiled
!:mime application/x-python-bytecode

magic 的手册页不鼓励使用“regex”(出于性能原因),但我认为这对我来说是最简单的选择。我希望这可以帮助其他人解决这个问题,如果他们遇到它——现在被检​​测为 text/x-python 的文件以前被 libmagic 识别为 text/x-java,这看起来真的很荒谬。

答案1

您几乎已经到达;它位于/usr/share/file/magic.mgc

$ file /usr/share/file/magic.mgc
/usr/share/file/magic.mgc: magic binary file for file(1) cmd (version 7) (little endian)

顺便说一下,我实际上只是稍微环顾了一下就发现了这一点,但你可以通过以下方式证明它实际上正在使用该文件strace

$ strace file /
<snip lots of output>
open("/usr/share/misc/magic.mgc", O_RDONLY) = 3
<snip a bit more output>

/usr/share/misc/magic.mgc只是另一个符号链接。我猜手册页已经过时了。

相关内容