Linux文件命令分类文件


17

我需要识别随机文件中包含的数据类型。我是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的数据库,它将为我提供当前可能的文件格式(键入文件命令并跟随文件时可以得到的输出)。那是对的吗?的确,每当“文件”命令输出中包含“文本”一词时,它是否表示您可以使用文本查看器阅读的内容,而没有“文本”的任何内容都是某种二进制文件?


6
将来,实际上不建议(或任何人都喜欢)发布终端输出的图片。使用降价代码块格式。
HalosGhost

3
我删除了图片并发布了代码。
user2543622

请注意:如果文件无法识别文件,则TrID通常可以。它具有自己的文件特征数据库,由社区使用它创建。
约瑟夫(Josef)说恢复莫妮卡(Monica)2014年

Answers:


13

file 使用多种测试

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

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

2:如果文件不是常规文件,则应标识其文件类型。文件类型目录,FIFO,套接字,特殊块和特殊字符都应这样标识。也可以标识其他实现定义的文件类型。如果文件是符号链接,则默认情况下应解析该链接,文件应测试符号链接引用的文件类型。(请参见下面的-h-i选项。)

这将像.: directory和输出/dev/sda: block specialPOSIX部分定义了此格式和上一点的大部分格式-您可以依赖输出中的某些字符串。

3:如果文件长度为零,则应将其标识为空文件。

这是foo: empty

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

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

这两个使用魔术数字标识,并且是命令中最有趣的部分。一个神奇的数字是一个字节一个特殊的序列是在一个已知的地方在一个文件中标识其类型。传统上,该位置是前两个字节,但该术语已被扩展为包括更长的字符串和其他位置。有关命令中幻数的更多详细信息,请参见另一个问题file

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

file它还具有一个将这些类型映射到名称的数据库,通过该数据库,它将知道已将其标识为的文件application/pdf描述为PDF document。这些人类可读的名称也可以本地化为另一种语言。这些将始终是人们会理解的文件类型的高级描述,而不是机器。

您可以获得的大多数不同输出将来自这些阶段。您可以在magic文件中查看受支持类型的列表以及如何识别它们-我的系统知道376种不同类型。给定的名称和支持的类型由您的系统包装和配置确定,因此您的系统可能比我的系统支持更多或更少的支持,但通常其中很多。libmagic还包括其他硬编码测试。

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

这是foo: data,但它根本无法弄清该文件的任何内容。

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


8

手册页通常是简短的参考,而不是简介。从Wikipedia页面开始。

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

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

的输出file很脆弱:unix变体和unix变体以及版本之间都可能不同。在Linux,Cygwin和* BSD上,该file命令支持一个选项-i,该选项以MIME 媒体类型的形式生成可预测的输出(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如果您不想在行首显示文件名,请传递该选项。


5

我希望你从这里阅读答案。答案的一些摘录是,

file命令的手册页中,

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

第一次测试

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

第二次测试

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

第三次测试

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

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

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

#include <iostream.h>
bla
bla

根据第三个测试,尽管我们手头有一个CPP程序,但该关键字#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 ++程序才被视为相同)。


1

Gilles和Michael Homer提供了出色的答案。我指的是你 要查看系统上识别的文件类型,请尝试运行

cat /usr/share/magic

如果那导致权限问题,或者不存在,则可能

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.