如果文件名没有后缀,我想知道文件类型是如何知道的。
例如,名为myfile的文件可以是二进制文件或文本文件,系统如何知道文件是二进制文件还是文本文件?
发布于 2015-06-03 12:08:37
file实用程序通过3种方式确定文件类型:
首先,文件系统测试:在这些测试中,对文件调用一个状态系列系统调用。这将返回不同的unix文件类型:常规文件、目录、链接、字符设备、块设备、命名管道或套接字。取决于此,魔术测试就完成了。
魔术测试要复杂一些。文件类型由一个名为魔法文件的模式数据库猜测。某些文件类型可以通过读取文件中特定位置的位或数字来确定(例如,二进制文件)。魔术文件包含“魔术数字”来测试文件是否包含它们,以及应该打印哪些文本信息。这些“魔术数字”可以是1-4字节值、字符串、日期,甚至是正则表达式。通过进一步的测试,可以找到更多的信息。对于可执行文件,附加信息将是动态链接还是非剥离或体系结构。有时,必须通过多个测试才能真正识别文件类型。但是无论如何,不管执行了多少个测试,这总是一个很好的猜测。
以下是一些常见文件类型文件中的前8个字节,可以帮助我们了解这些神奇数字的外观:
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
ZIP 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5如果无法通过魔术测试找到该文件类型,则该文件似乎是一个文本文件,file将查找内容的编码。编码由构成每个集合中可打印文本的不同范围和字节序列来区分。
还将根据其HEX值对断线进行调查:
0A (\n)对Un*x/Linux/BSD/OSX终止文件进行分类0D 0A (\r\n)是Microsoft操作系统的文件。0D (\r)将一直使用Mac OS,直到版本9。15 (\025)将是IBMs AIX现在语言测试开始了。如果该文件看起来是文本文件,则会搜索特定的字符串,以确定它包含哪种语言(C、Perl、Bash)。在脚本的第一行中,还可以通过哈什邦 (#!/bin/interpreter)识别一些脚本语言。
如果不适用于该文件,则无法确定文件类型,file只打印“数据”。
所以,你看没有必要用后缀。不管怎么说,如果设置错了,后缀可能会混淆。
发布于 2015-06-03 14:25:10
通常情况下,它并不在乎。你只需把它传递给一个程序,它要么解释它,要么它不解释它。在文本编辑器中打开一个.jpg可能没有用,但没有阻止你这样做。像文件名的其他部分一样,扩展是为了人类的组织方便。
还可以构造可以以多种方式有效解释的文件。因为ZIP文件格式开始时在文件末尾有一个头,所以您可以将其他内容放在前面,并且它仍然将作为一个ZIP文件加载。这通常用于制作自解压缩的zip文件。
发布于 2015-06-03 11:39:42
首先要检查的是内核识别的硬编码文件类型。这些文件类型包括目录、字符-特殊文件、块-特殊文件、管道-特殊文件、套接字和符号链接。此信息来自文件的inode。如果该文件是一个普通文件,则通过查找模式,下一组信息来自前256个字节。因此,通过检查这些字节,可以识别文本文件和C源代码。此外,这些实用程序还寻找用于测试和验证文件类型的神奇数字。可以通过将信息添加到文件/etc/magic来添加要识别的自己的文件类型。请参考magic(5)手册页查看神奇文件的格式。
在较早的实现(例如Solaris)中,文件/etc/magic枚举了可识别的大多数文件类型。
https://unix.stackexchange.com/questions/207276
复制相似问题