Linux file命令对文件进行分类

Linux file命令对文件进行分类

我需要识别随机文件中包含的数据类型。我是 Linux 新手。

我计划使用该file命令来了解文件的数据类型。我尝试了该命令并得到了下面的输出。

有人向我建议该file命令查看文件的初始字节以确定数据类型。该file命令根本不查看文件扩展名。那是对的吗?我看了看手册页但又觉得技术性太强。如果有人可以提供一个链接,其中对file命令的工作原理有更简单的解释,我将不胜感激。

运行命令后我可以获得哪些不同的可能答案file?例如,在下面的记录中我得到了 JPEG、ISO 媒体、ASCII 等:

屏幕输出如下

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


更新1

感谢您的回答,他们为我澄清了一些事情。

因此,如果我理解正确,文件夹 /usr/share/mime/magic 有一个数据库,它将为我提供当前可能的文件格式(当我键入文件命令并在其后跟随一个文件时可以获得的输出)。那是对的吗?每当“文件”命令输出包含“文本”一词时,它是否真的指的是您可以使用文本查看器读取的内容,而任何没有“文本”的内容都是某种二进制文件?

答案1

file 使用多种测试:

1:如果文件不存在、无法读取或无法确定其文件状态,输出应指示该文件已被处理,但无法确定其类型。

这将输出像cannot open file: No such file or directory.

2:如果文件不是普通文件,则需要识别其文件类型。文件类型目录、FIFO、套接字、特殊块和特殊字符应如此标识。还可以识别其他实现定义的文件类型。如果文件是符号链接,则默认情况下应解析该链接,并且文件应测试符号链接引用的文件类型。 (请参阅下面的-h-i选项。)

这将输出类似于.: directory/dev/sda: block special。这一点和上一点的大部分格式是部分由 POSIX 定义- 您可以依赖输出中的某些字符串。

3:如果文件长度为零,则识别为空文件。

这是foo: empty

4:文件实用程序应检查文件的初始段,并应根据位置敏感测试来猜测识别其内容。 (不保证答案正确;请参阅下面的 -d、-M 和 -m 选项。)

5:文件实用程序应检查文件并根据上下文相关的默认系统测试来猜测识别其内容。 (不保证答案正确。)

这两个使用幻数识别是命令中最有趣的部分。 A幻数是一个特殊的字节序列,位于文件中的已知位置,用于标识其类型。传统上,该位置是前两个字节,但该术语已进一步扩展以包括更长的字符串和其他位置。看这另一个问题有关命令中幻数的更多详细信息file

file命令有一个包含这些数字及其对应类型的数据库;该数据库通常位于/usr/share/mime/magic,并将文件内容映射到MIME 类型。那里的输出(通常file -i是默认情况下没有得到它的一部分)将是定义的媒体类型或扩展。 “上下文相关测试”使用相同的方法,但有点模糊。这些都不能保证是正确的,但它们旨在成为很好的猜测。

file还有一个将这些类型映射到名称的数据库,通过该数据库,它会知道它所识别的文件application/pdf可以被描述为PDF document.这些人类可读的名称也可以本地化为另一种语言。这些始终是文件类型的一些高级描述,以人而非机器能够理解的方式进行。

您可以获得的大多数不同输出都来自这些阶段。您可以查看该magic文件以获取支持的类型列表以及它们的识别方式 - 我的系统支持 376 种不同的类型。给出的名称和支持的类型由您的系统打包和配置决定,因此您的系统支持的数量可能比我的多或少,但通常有很多。libmagic还包括额外的硬编码测试。

6:该文件应被识别为数据文件。

这是foo: data当它根本无法弄清楚有关该文件的任何信息时。

还可以出现其他小标签。可执行 ( ) 文件将在输出中+x包含“ ”,通常以逗号分隔。executablefile实现还可能了解有关某些文件格式的额外信息,以便能够描述有关它们的其他点,如您的“ PDF document, version 1.4”。

答案2

手册页通常是简洁的参考资料,而不是介绍。从维基百科页面

file只查看文件内容,不查看文件名。 (它还会查看一些文件元数据,例如文件类型:目录、符号链接、命名管道等。但在您感兴趣的情况下,重要的是内容。)

file通常通过查看前几个字节并将它们与内置表进行比较来猜测文件的格式神奇的数字。例如,如果文件以 开头%PDF,则file报告“PDF 文档”(并进一步挖掘以报告最低版本)。对于不以幻数开头的文件类型,它包含启发式方法,例如,如果前几个字节都在可打印的 ASCII 范围内,则报告“ASCII 文本”。

的输出file很脆弱:它可能因不同的 UNIX 变体和不同的版本而异。在 Linux、Cygwin 和 *BSD 上,该file命令支持一个选项-i,该选项以以下形式生成可预测的输出:哑剧 媒体类型(IANA 管理标准媒体类型列表)。没有那么多细节,输出不太人性化,但输出是可预测的并且对计算机友好。

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

file --mime-type如果您只需要 MIME 类型本身而不需要编码信息,请使用,例如application/pdf.-b如果您不想在行首显示文件名,请传递该选项。

答案3

我想让你读一下来自的答案这里。答案的一些摘录是,

从命令的手册页来看file

file命令实际上执行了 3 个测试来确定文件类型。

第一次测试

文件系统测试基于检查 stat(2) 系统调用的返回结果。

第二次测试

幻数测试用于检查具有特定固定格式数据的文件。

第三次测试

语言测试查找可能出现在文件前几个块中任何位置的特定字符串(参见 name.h)。例如,关键字 .br 表示该文件很可能是 troff(1) 输入文件,就像关键字 struct 表示 C 程序一样。

命令的输出file通常基于任何成功测试的结果。

现在,假设 C++ 程序像这样启动,并且第三次测试成功,

#include <iostream>
bla
bla

根据第三个测试,关键字#include特别指定它的类型C程序虽然我们有一个消费者保护计划程序在手。现在,当我检查时,

$ file example.cpp

example.cpp: ASCII C program text

现在,面向对象的概念是 C++ 特有的。让我们创建一个特定的文件C++

我开始我的 C++ 程序,

class something
{
}
bla
bla

现在,当我发出

$ file example.cpp

输出是,

example.cpp: ASCII C++ program text

这基本上解释了file命令如何处理相似的文件(在本例中,C 程序和 C ++ 程序被视为相同,除非并且直到我们使用特定于 C ++ 的面向对象功能)。

答案4

吉尔斯和迈克尔·霍默提供了出色的答案。我推荐你参考一下。要查看系统上识别的文件类型,请尝试运行

cat /usr/share/magic

如果这会带来权限问题,或者不存在,那么可能

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(可能需要根据您的系统进行调整)这应该会显示系统上的文件类型列表。该命令可能需要很长时间才能运行,具体取决于根文件系统的大小。

相关内容