“文件 --mime-type 路径”如何对没有扩展名的文件起作用

“文件 --mime-type 路径”如何对没有扩展名的文件起作用

要查找我们不知道的文件 mime 类型,我们将使用带有 --mime-type 参数的 file 命令。我们知道它根据给定的文件路径扩展名显示结果(例如 *.py 的 text/x-python)。扩展名和 mime 类型之间关系的列表将保存在某个地方,例如 /etc/mime.type 或 /usr/share/mime/glob。但是对于那些没有任何扩展名的文件怎么办?我们如何找到 mime 类型?请解释一下。我们能用 python 做同样的事情吗?

答案1

在 Linux 系统中,扩展程序几乎无关紧要。与 Windows 不同,绝大多数 Linux 工具根本不依赖扩展程序。例如:

$ cat script.py
#!/usr/bin/python
print("Works!")
$ chmod 777 script.py 
$ ./script.py 
Works!

现在,使用不同的扩展:

$ mv script.py script.foo
$ ./script.foo 
Works!

所以,忘掉扩展吧。它们很少相关,file也不使用它们。看看man file(请阅读man file,这只是那里的部分信息):

file 测试每个参数以尝试对其进行分类。有三组测试按以下顺序执行:文件系统测试、魔术测试和语言测试。第一个成功的测试会导致打印文件类型。

文件系统测试基于检查 stat(2) 系统调用的返回值。程序会检查文件是否为空,或者是否是某种特殊文件。如果系统头文件中定义了任何适用于您正在运行的系统(套接字、符号链接或命名管道 (FIFO),则这些文件类型在实现它们的系统上)都是直观的。

魔法测试用于检查包含特定固定格式数据的文件。典型示例是二进制可执行文件(编译程序)a.out,其格式在 中定义,可能在标准包含目录中。这些文件在文件开头附近的特定位置存储了一个“魔法数字”。

如果文件与魔法文件中的任何条目都不匹配,则将检查该文件是否为文本文件。ASCII、ISO-8859-x、非 ISO 8 位扩展 ASCII 字符集(例如 Macintosh 和 IBM PC 系统上使用的字符集)、UTF-8 编码的 Unicode、UTF-16 编码的 Unicode 和 EBCDIC 字符集可以通过构成每个集合中可打印文本的不同字节范围和序列来区分。如果文件通过了其中任何一项测试,则会报告其字符集。

一旦文件确定了文本类型文件中使用的字符集,它将尝试确定该文件是用哪种语言编写的。语言测试会查找可能出现在文件前几个块中任何位置的特定字符串(参见)。例如,关键字 .br 表示该文件很可能是 troff(1) 输入文件,就像关键字 struct 表示 C 程序一样。这些测试的可靠性不如前两组,因此它们最后执行。语言测试例程还会测试一些杂项(例如 tar(1) 档案、JSON 文件)。

相关内容