根据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
只是另一个符号链接。我猜手册页已经过时了。