「file(1)」-

  LINUX MANUAL PAGES

确定文件类型

命令语法格式

file [-bcdEhiklLNnprsvzZ0] [–apple] [–extension] [–mime-encoding] [–mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] [-P name=value] file …

file -C [-m magicfiles]

file [–help]

命令描述

本手册页介绍了5.29版的file命令。

file测试每个参数以尝试对其进行分类。按顺序执行三组测试:文件系统测试、魔数测试、语言测试。第一个成功的测试导致打印文件类型。

打印的类型通常包含一个单词:

  • text(该文件只包含打印字符和一些常用控制字符,并且可以安全地在ASCII终端上读取);
  • executable(该文件包含编译程序的结果,某些UNIX内核或其他内容可以理解的形式;
  • data意味着其他任何东西(数据通常是“二进制”或不可打印)。例外是已知包含二进制数据的众所周知的文件格式(核心文件,tar档案)。

将本地定义添加到/etc/magic时,请确保保留这些关键字。用户依赖于知道在目录中的所有可读文件都打印了“text”一词。不要像伯克利那样做,并将“shell commands text”更改为“shell script”。

文件系统测试:基于检查stat(2)系统调用的返回。程序检查文件是否为空,或者它是否是某种特殊文件。如果在系统头文件<sys/stat.h>中定义了文件类型,则凭直觉判断适合于当前运行的系统的任何已知文件类型(在那些实现套接字、符号链接、命名管道(FIFO)的系统上)。

魔数测试:用于检查具有特定固定格式的数据的文件。这个规范的例子是二进制可执行文件(编译程序)a.out文件,其格式在标准include目录中的<elf.h>,<a.out.h>、<exec.h>中定义。这些文件有一个“魔数”存储在文件开头附近的特定位置,用于告诉UNIX操作系统该文件是二进制可执行文件,以及其中的几种类型。“魔数”的概念已通过扩展应用于数据文件。在文件的小固定偏移处具有一些不变标识符,可以用这种方式来描述任何文件。标识这些文件的信息从/etc/magic和编译的魔术文件/usr/share/misc/magic.mgc中获取,或如果编译的文件不存在,则从目录/usr/share/misc/magic中的文件中读取。此外,如果存在$HOME/.magic.mgc或$HOME/.magic,它将优先于系统魔术文件使用。

语言测试:如果文件与魔术文件中的任何条目都不匹配,则会检查它是否看起来像是文本文件。通过构成每个集合中的可打印文本的不同范围和字节序列,以此来区分ASCII,ISO-8859-x,非ISO 8位扩展ASCII字符集(例如Macintosh和IBM PC系统上使用的字符集),UTF-8编码的Unicode,UTF-16编码的Unicode,EBCDIC字符集。如果文件通过任何这些测试,则报告其字符集。ASCII,ISO-8859-x,UTF-8,扩展ASCII文件被标识为“text”,因为它们几乎可以在任何终端上读取;UTF-16和EBCDIC只是“character data”,因为虽然它们包含文本,但是它的文本在可以读取之前需要翻译。此外,file将尝试确定文本类型文件的其他特征。如果文件的行由CR,CRLF,NEL终止,而不是Unix标准的LF,则会进行报告。还将识别包含嵌入式转义序列或加粗的文件。

一旦文件确定了文本类型文件中使用的字符集,它将尝试确定文件以何种语言编写。语言测试查找特定字符串(参见<names.h>),它们可以出现在文件的前几个块中的任何位置。例如,关键字.br表示该文件很可能是troff(1)输入文件,就像关键字struct表示C程序一样。这些测试不如前两组可靠,因此它们最后执行。语言测试例程还测试一些杂项(例如tar(1)档案)。

任何无法识别为已经使用上面列出的任何字符集编写的文件都被简单地称为“data”。

命令支持的选项及含义

–apple
使file命令输出较旧MacOS版本使用的文件类型和创建者代码。代码由八个字母组成,第一个描述文件类型,后者描述创建者。

-C, –compile
编写一个magic.mgc输出文件,其中包含魔术文件或目录的预解析版本。

-m, –magic-file magicfiles
指定包含魔术的文件和目录的备用列表。这可以是单个项目,也可以是以冒号分隔的列表。如果在文件或目录旁边找到编译的魔术文件,则将使用它。

-c, –checking-printout
导致检查魔术文件的解析形式的打印输出。这通常与-m标志一起使用,以在安装之前调试新的魔术文件。

-e, –exclude testname
从用于确定文件类型的测试列表中排除testname中指定的测试。有效的测试名称是:

apptype,EMX应用程序类型(仅适用于EMX)。


ascii,各种类型的文本文件(此测试将尝试猜测文本编码,而不考虑’encoding’选项的设置)。


encoding,软魔术测试的不同文本编码。


tokens,忽略了向后兼容性。


cdf,打印复合文档文件的详细信息。


compress,检查压缩文件,并查看内容。


elf,打印ELF文件细节,提供软魔术测试和找到的ELF魔术。


soft,咨询魔术文件。


tar,检查tar文件。


text,’ascii’的同义词。

-f, –files-from namefile
在参数列表之前,从namefile(每行一个)中读取要检查的文件的名称。必须存在namefile或至少一个filename参数;要测试标准输入,请使用’-‘作为namefile参数。请注意,在遇到此选项时以及在完成任何其他选项处理之前,将解包名称文件并处理所附文件名。这允许在同一file调用中处理具有不同命令行参数的多个文件列表。因此,如果要设置分隔符,则需要在指定文件列表之前执行此操作,例如:“-F @ -f namefile”,而不是:“-f namefile -F @”。

-k, –keep-going
不要在第一个匹配停止,继续前进。后续匹配将前缀字符串’\012- ‘。(如果需要换行符,请参阅-r选项。)具有最高强度的魔术模式(请参阅-l选项)首先出现。

-E
在文件系统错误(找不到文件等)上,发出错误消息并退出。而不是像POSIX强制要求那样将错误作为常规输出处理,并继续运行。

-l, –list
显示模式列表及其强度,按magic(4)强度降序排序,用于匹配(另请参阅-k选项)。

-p, –preserve-date
在支持utime(3)或utimes(2)的系统上,尝试保留所分析文件的访问时间,假装该file从不读取它们。

-P, –parameter name=value
设置各种参数限制。

Name         Default    Explanation
indir        15         recursion limit for indirect magic
name         30         use count limit for name/use magic
elf_notes    256        max ELF notes processed
elf_phnum    128        max ELF program sections processed
elf_shnum    32768      max ELF sections processed
regex        8192       length limit for regex searches
bytes        1048576    max number of bytes to read from file

-r, –raw
不要将不可打印的字符翻译为\ooo。通常,file将不可打印的字符转换为八进制表示。

-s, –special-files
通常,file只会尝试读取并确定stat(2)报告为普通文件的参数文件的类型。这可以防止出现问题,因为读取特殊文件可能会产生特殊后果。指定-s选项会导致file还读取作为块或字符特殊文件的参数文件。这对于确定原始磁盘分区(块特殊文件)中的数据的文件系统类型很有用。此选项还会导致文件忽略stat(2)报告的文件大小,因为在某些系统上,它报告原始磁盘分区的大小为零。

-z, –uncompress
尝试查看压缩文件。

-Z, –uncompress-noreport
尝试查看压缩文件内部,但报告有关内容的信息,仅未压缩文件。

控制输出内容

-b, –brief
不要将文件名前置到输出行(简短模式)。

-N, –no-pad
不要填充文件名。

未指定该选项时,file对文件名进行了填充,以使输出对齐。

-F separator, –separator separator
使用separator作为文件名和返回的文件类型结果之间的分隔符。默认为’:’。

-0, –print0
在文件名结尾后输出一个空字符(\0)。对cut(1)输出友好。这不会影响仍然打印的分隔符。

如果此选项重复多次,则file只打印:文件名 NUL 描述(或错误: text) 第二个NUL字符(跟在每个条目后)。

-i, –mime
输出MIME类型字符串,而不是更传统的可读字符串。因此它可能会输出“text/plain; charset=us-ascii”而不是“ASCII text”。

–mime-type, –mime-encoding
与-i类似,但仅打印指定的MIME元素。

–extension
为找到的文件类型打印斜杠分隔的有效扩展名列表。

-n, –no-buffer
检查每个文件后,强制刷新到标准输出。这仅在检查多个文件时有用。它旨在由希望从管道中读取输出文件类型的程序使用。

符号链接

-L, –dereference
在支持符号链接的系统上,解析符号链接,使用其指向的文件,作为ls(1)中类似命名的选项。

如果定义了环境变量POSIXLY_CORRECT,则这是默认值。

-h, –no-dereference
在支持符号链接的系统上,不解析符号链接。

如果未定义环境变量POSIXLY_CORRECT,则这是缺省值。

调试选项

-d
向标准错误中输出内部的调试信息。

其他选项

-v, –version
显示版本信息然后退出。

–help
显示帮助信息,然后退出。

注意事项

魔数目录

魔数文件条目已从各种来源收集,主要是USENET,并由各种作者提供。Christos Zoulas(地址如下)将收集额外或更正的魔术文件条目。将定期分发魔术文件条目的合并。

魔术文件中条目的顺序很重要。根据您使用的系统,它们放在一起的顺序可能不正确。

标准一致性

该程序被认为超过了System V Interface Definition of FILE(CMD),因为可以从其中包含的模糊语言确定。它的行为主要与同名的System V程序兼容。然而,这个版本知道更多的魔数,因此在许多情况下它会产生不同的(尽管更准确)输出。

此版本与System V之间的一个显着区别是此版本将任何空格视为分隔符,因此必须转义模式字符串中的空格。例如,

>10 string language impress (imPRESS data)

在现有的魔术文件中必须更改为

>10 string language\ impress (imPRESS data)

此外,在此版本中,如果模式字符串包含反斜杠,则必须对其进行转义。例如

0 string \begindata Andrew Toolkit document

在现有的魔术文件中必须更改为

0 string \\begindata Andrew Toolkit document

Sun Microsystems的SunOS版本3.2及更高版本包含一个源自System V的file命令,但有一些扩展名。这个版本与Sun的版本只有很小的不同。它包括’&’运算符的扩展,例如:

>16 long&0x7fffffff >0 not stripped

有关/etc/magic的格式可以参考man 5 magic

相关文件

/usr/share/misc/magic.mgc
默认编译的模式列表。

/usr/share/misc/magic
包含默认魔数文件的目录。

相关环境变量

MAGIC
可用于设置默认魔术文件名。如果设置了该变量,则file将不会尝试打开$HOME/.magic。file根据需要将“.mgc”添加到此变量的值。但是,必须存在文件才能考虑file.mime。

POSIXLY_CORRECT
在支持符号链接的系统上,file是否会尝试遵循符号链接。如果设置,则文件遵循符号链接,否则不符合。这也由-L和-h选项控制。

退出状态

0 成功

>0 发生错误。

使用示例

# file file.c file /dev/{wd0a,hda}
file.c: C program text
file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), stripped
/dev/wd0a: block special (0/0)
/dev/hda: block special (3/0)

# file -s /dev/wd0{b,d}
/dev/wd0b: data
/dev/wd0d: x86 boot sector

# file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda: x86 boot sector
/dev/hda1: Linux/i386 ext2 filesystem
/dev/hda2: x86 boot sector
/dev/hda3: x86 boot sector, extended partition table
/dev/hda4: Linux/i386 ext2 filesystem
/dev/hda5: Linux/i386 swap file
/dev/hda6: Linux/i386 swap file
/dev/hda7: Linux/i386 swap file
/dev/hda8: Linux/i386 swap file
/dev/hda9: empty
/dev/hda10: empty

# file -i file.c file /dev/{wd0a,hda}
file.c: text/x-c
file: application/x-executable
/dev/hda: application/x-not-regular-file
/dev/wd0a: application/x-not-regular-file

相关手册

hexdump(1), od(1), strings(1), magic(5)

参考文献

  • man 1 file, Version 15.29-3

更新日志

  • 09/22/2018 创建文章