Nik*_* R. 56 filesystems mime-types files file-opening
如果文件名没有后缀,我想知道如何知道文件类型。
例如,命名的文件myfile
可以是二进制或文本开头,系统如何知道文件是二进制还是文本?
cha*_*aos 86
该file
实用程序通过 3 种方式确定文件类型:
首先是文件系统测试:在这些测试中,对文件调用stat系列系统调用之一。这将返回不同的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
Run Code Online (Sandbox Code Playgroud)
如果无法通过魔术测试找到文件类型,则该文件似乎是一个文本文件并file
查找内容的编码。编码的区别在于构成每个集合中可打印文本的不同范围和字节序列。
还研究了换行符,具体取决于它们的 HEX 值:
0A
( \n
) 对 Un*x/Linux/BSD/OSX 终止文件进行分类0D 0A
( \r\n
) 是来自 Microsoft 操作系统的文件0D
( \r
) 将是 Mac OS 直到版本 915
( \025
) 将是 IBM 的 AIX现在开始语言测试。如果它看起来是一个文本文件,则会在该文件中搜索特定的字符串以找出它包含的语言(C、Perl、Bash)。某些脚本语言也可以通过脚本第一行中的hashbang ( #!/bin/interpreter
)来标识。
如果没有任何内容适用于该文件,则无法确定文件类型并file
仅打印“数据”。
因此,您会看到不需要后缀。无论如何,如果设置错误,后缀可能会造成混淆。
pjc*_*c50 20
通常,它不在乎。你只需将它传递给一个程序,它要么解释它,要么不解释它。在文本编辑器中打开 .jpg 可能没有用,但您不会被阻止这样做。扩展名与文件名的其余部分一样,是为了人类的组织方便。
也可以构建可以以多种方式有效解释的文件。因为 ZIP 文件格式开始在文件末尾有一个标题,您可以在前面添加其他内容,它仍然会作为 ZIP 文件加载。这通常用于制作自解压 zip 文件。
h3r*_*ler 14
该信息通常在文件的标题中找到。该file
命令会分析目标并告诉您有关该文件的信息。许多信息通常来自文件头,通常是文件的前几个字节(见下文)。系统使用标头来确定如何处理文件。 #!/bin/bash
在文件的开头告诉系统使用 bash shell 来解释以下脚本。ELF
告诉系统这是一个 ELF 可执行文件。
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
Run Code Online (Sandbox Code Playgroud)
文件头示例:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
Run Code Online (Sandbox Code Playgroud)
首先要检查的是内核识别的硬编码文件类型。这些是文件类型,例如目录、字符特殊文件、块特殊文件、管道特殊文件、套接字和符号链接。此信息来自文件的 inode。如果文件是普通文件,则下一组信息通过查找模式来自前 256 个字节。因此,通过检查这些字节来识别文本文件和 C 源代码。此外,实用程序还会查找用于测试和验证文件类型的幻数。您可以通过将信息添加到文件来添加自己的文件类型以进行识别/etc/magic
。请参阅手册页magic(5)
以查看魔法文件的格式。
在较旧的实现中(例如 Solaris),该文件/etc/magic
枚举了大多数可识别的文件类型。