如果不是来自文件后缀,如何知道文件类型?

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 直到版本 9
  • 15( \025) 将是 IBM 的 AIX

现在开始语言测试。如果它看起来是一个文本文件,则会在该文件中搜索特定的字符串以找出它包含的语言(C、Perl、Bash)。某些脚本语言也可以通过脚本第一行中的hashbang ( #!/bin/interpreter)来标识。

如果没有任何内容适用于该文件,则无法确定文件类型并file仅打印“数据”。

因此,您会看到不需要后缀。无论如何,如果设置错误,后缀可能会造成混淆。

  • 还有 freedesktop.org 共享 MIME 数据库,基本上所有 X11 应用程序都使用它。这在概念上与`file(1)` 的功能相似,但具有(非常)不同的实现。 (4认同)
  • 请注意,此过程的结果基本上是一种猜测,不应依赖于任何重要的事情。(便利功能,例如决定打开文件的默认程序,都很好) (4认同)

pjc*_*c50 20

通常,它不在乎。你只需将它传递给一个程序,它要么解释它,要么不解释它。在文本编辑器中打开 .jpg 可能没有用,但您不会被阻止这样做。扩展名与文件名的其余部分一样,是为了人类的组织方便。

也可以构建可以以多种方式有效解释的文件。因为 ZIP 文件格式开始在文件末尾有一个标题,您可以在前面添加其他内容,它仍然会作为 ZIP 文件加载。这通常用于制作自解压 zip 文件。

  • 重新最后一段:[Funky 文件格式](http://media.ccc.de/browse/congress/2014/31c3_-_5930_-_en_-_saal_6_-_201412291400_-_funky_file_formats_-_ange_albertini.html 上的一个有趣的谈话#该主题,呈现例如一个 jpeg,它也是一个 java hello world 程序,在 AES 加密后它变成一个 PNG,或者在 3DES 解密后它变成一个 PDF 等等(所有内容都有“有趣”的内容,即不仅仅是白噪声或文物) (4认同)

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)

  • 这是相当具有误导性的。Unix 文件本身没有“标题”。`file` 命令试图从文件的内容中猜测文件的用途。它并非万无一失。 (3认同)
  • 但是您的回答听起来像是标题是 Unix 文件的固有特征。例如,文本文件没有这样的标题;像 OP 这样的人可能会认为 C 源文件和 Java 源文件具有不同的“文件类型”,但没有标头来区分它们。我认为“文件类型”在 Unix 下甚至不是一个有意义的概念;操作系统只提供一个文件系统,由每个应用程序决定任何给定文件的内容意味着什么。 (2认同)

unx*_*nut 7

首先要检查的是内核识别的硬编码文件类型。这些是文件类型,例如目录、字符特殊文件、块特殊文件、管道特殊文件、套接字和符号链接。此信息来自文件的 inode。如果文件是普通文件,则下一组信息通过查找模式来自前 256 个字节。因此,通过检查这些字节来识别文本文件和 C 源代码。此外,实用程序还会查找用于测试和验证文件类型的幻数。您可以通过将信息添加到文件来添加自己的文件类型以进行识别/etc/magic。请参阅手册页magic(5)以查看魔法文件的格式。

在较旧的实现中(例如 Solaris),该文件/etc/magic枚举了大多数可识别的文件类型。