我搜索过四周但似乎找不到有关该主题的任何信息。
如何为现有文件设置 MIME 类型?
例如,我试图创建一个类型为text/html
答案1
MIME 类型实际上并不存储在文件系统中。它们只是了解如何处理文件的一种方便方式。要获取 MIME 类型,您必须运行一个程序。
有些程序会通过查看文件扩展名来检测文件的 mime 类型,而其他程序则会检查文件是否神奇数字或特殊魔法图案(本质上正则表达式)。
举例来说,运行touch test.html
,它将创建一个空文件。
然后运行xdg-mime query filetype test.html
或mimetype test.html
。它们都将返回类型text/html
。
但是,如果你运行file --mime-type -b test.html
,它将返回inode/x-empty
。
因此,如果您希望所有程序以相同的方式对文件进行操作,则文件应该具有正确的格式(数据)以及正确的扩展名。
什么是神奇数字?
在我的个人资料图片上运行
xxd image | head -1
将产生如下输出:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
根据 维基百科,
89 50 4E 47 0D 0A 1A 0A
是所有文件的标准标题image/png
。
文件命令如何工作?
来自file(1)
手册页:
有三组测试按以下顺序执行:文件系统测试、魔术测试和语言测试。...
文件系统测试基于检查
stat(2)
系统调用。程序检查文件是否为空,或者是否是某种特殊文件。...魔术测试用于检查具有特定固定格式数据的文件。...这些文件在文件开头附近的特定位置存储了一个“魔术数字”,该数字告诉 UNIX 操作系统该文件是二进制可执行文件,以及是其中的哪一种类型。...如果文件与魔术文件中的任何条目都不匹配,则检查它是否看起来像文本文件。...
任何无法识别为以列出的任何字符集写入的文件……都将被简单地称为“数据”。
文件如何知道要使用什么魔法模式?
再次,从file(1)
手册页:
识别这些文件的信息是从编译后的魔法文件 中读取的,如果编译后的文件不存在,
/usr/share/misc/magic.mgc
则从目录中的文件读取。此外,如果或存在,将优先于系统魔法文件使用它。如果 /etc/magic 存在,它将与其他魔法文件一起使用。/usr/share/misc/magic
$HOME/.magic.mgc
$HOME/.magic
如果我运行,strace file image |& grep magic
我们可以看到该file
命令查找这些文件:
/usr/lib/x86_64-linux-gnu/libmagic.so.1 =>libmagic(3) ~/.magic.mgc
~/.magic
/etc/magic.mgc
/etc/magic
/usr/share/misc/magic.mgc
还有其他文件,例如/etc/mime.types
其他程序使用的。此文件将扩展名分配给 mime 类型。例如,grep -i text/html /etc/mime.types
生成:
text/html html htm shtml