file

确定文件的类型


语法格式

file [-0bchikLNnprsvz] [-e testname] [-f file] [-F sep] [-m magics]
        [--mime-type] files
file -C [-m magics]
file [--help] [-v|--version]

命令简介

file命令主要用于测试、最终确定指定文件内容的类型。其中,files是需要测试的一个或一组文件。file命令采用3组测试方式来确定文件的类型。测试的顺序依次为文件系统测试、魔术(magic)代码测试和语言测试。不管测试到哪一步,一旦测试成功,立即输出文件的类型。

输出的文件类型通常包含text(文件中只有可打印字符和少量的通用控制字符,能够在普通终端上正常显示)、executable(文件含有编译生成的、系统内核能够识别的二进制目标程序代码)或data(文件含有此外的其他任何数据,通常是“二进制”数据或不可打印的字符)等文字之一。例外的是内存映像文件(core)或tar档案文件等已知的文件格式,其中也包含二进制数据。

文件系统测试主要是考察stat(2)系统调用的返回结果。检测文件是否为空,是否为特殊文件、套接字、符号链接文件或管道文件等。

魔术代码测试用于检测文件数据是否具有特殊的固定格式。例如,编译生成的a.out类型的二进制目标程序代码格式(参见a.out.h文件)等,其文件前部的特定位置都存在一个魔术代码,告诉系统这是一个可执行的二进制目标文件。实际上,魔术代码的概念已广泛用于各种数据文件,具有固定标识符的任何文件,其前部的偏移位置通常都存有这样的描述代码。标识此类文件的信息存储在编译的/usr/share/misc/magic.mgc魔术代码文件中。如果编译的魔术代码文件不存在,可以读取/usr/share/misc/magic目录[1]中的文件。此外,如果$HOME/.magic.mgc或$HOME/.magic文件存在,file命令将会优先选用用户定义的魔术代码文件。注意,也可使用MAGIC环境变量定义默认的魔术代码文件。

如果文件不匹配魔术代码文件中的任何定义,file命令需要检测其是否为文本文件,如由ASCII、ISO-8859-x、扩充的8位ASCII字符集、UTF-8编码的字符集、UTF-16编码的字符集,以及EBCDIC字符集等可打印字符构成的文本文件。如果文件通过了其中的任何一种测试,则报告其字符集。ASCII、ISO-8859-x、UTF-8和扩充的ASCII字符文件均标识为“text”类型的文件,因为其数据基本上均可在任何终端中显示。UTF-16和EBCDIC只能标识为“character data”类型的文件,因为其中虽然包含文本数据,但通常需要在转换之后才能显示。此外,file命令还会尝试确定文本类型文件的其他特性。例如,如果文件的数据行采用CR、CRLF或NEL而非UNIX标准的LF作为行终止符,file命令会适当地指出。如果文件包含内嵌的ESC转义序列或表示重打加黑输出的退格字符,file命令也会适当地标识。

一旦确定了文本类型文件中使用的字符集,file命令还将尝试确定文件是由哪一种语言或程序创建的文件。语言测试主要检索文件前部的特定字符串。例如,关键字“.br”表示文件可能是一个troff文件,关键字“#include”等表示文件可能是一个C源代码文件。此外,语言测试也进行其他杂项测试,如tar档案文件等。与前述两种测试相比,语言测试的可靠度相对较低,故语言测试只是file命令最后执行的一种测试。

如果既无法确定文件数据使用的字符集,也无法通过语言测试,这样的文件仅仅标记为“data”类型的文件。

命令选项

-0, --print0  仅在文件名字段后面附加一个NULL字符“\0”,作为文件名分隔符,以便于cut等命令截取文件名字段。其他输出数据(包括字段分隔符)不受影响,一切照旧。

-b, --brief  禁止输出文件名(简短模式)。

-c, --checking-printout  输出魔术代码文件的解析。通常应与“-m”选项一起使用,调试新建的魔术代码文件。

-C, --compile  生成一个magic.mgc输出文件,其中包含预解析版的魔术代码文件或 目录。

-e, --exclude testname  从标准的测试中排除测试名testname指定的测试,之后再确定文件的类型。有效的测试名是:

apptype  EMX应用类型。
text  各种类型的文本文件。
encoding  采用不同文本编码的魔术代码测试。
tokens  检索文本文件中已知的标记。
cdf  显示合成文档文件(CDF)的详细信息。
compress  检测或检索压缩的文件。
elf  显示ELF文件的详细信息。
soft  查阅魔术代码文件。
tar  考察tar档案文件。

-f file, --files-from file  在读取参数表之前,从指定的文件中读取需要考察的文件名(每行一个文件名)。在file命令行中,必须存在“-f”选项指定的文件或至少一个文件参数。如果想要从标准输入读取待考察的文件,则可以使用“-”作为文件 参数。

-F sep, --separator sep  使用指定的字符串作为文件名与返回的文件类型之间的分隔符。默认值为冒号“:”。

-h, --no-dereference  仅考察符号链接文件本身而非其引用的文件。如果环境变量POSIXLY_CORRECT未定义,则这是默认的处理方式。

-i, --mime  输出mime类型的字符串而非传统的描述性文字说明,如输出类似“text/plain; charset=us-ascii”的字符串而非传统的“ASCII text”文字。为达此目的,file修改了文件识别的处理方法(采用许多定义文件类型的文本文件,如/usr/share/misc/magic,编译版的默认魔术代码文件,如/usr/share/ misc/magic.mgc,以及采用备用的魔术代码文件等)。

-k, --keep-going  在发现第一个匹配的文件类型时还要继续考察。后续再发现匹配时将会在文件类型前冠一个“\012-”字符串前缀。如果想要换行输出,可以增加“-r”选项。

-L, --dereference  考察符号链接文件引用的文件而非其自身。如果环境变量POSIXLY_ CORRECT已经定义,这是默认的处理方式。

-m magics, --magic-file magics  指定一个或一组(中间加冒号“:”分隔符)替代的魔术代码文件或目录。

-n, --no-buffer  在检测每个文件之后,强制腾空标准输出的缓冲区。这个选项主要用于在管道情况下处理一组文件的检测结果。

-N, --no-pad  禁止在文件名字段后面填充空白字符(填充空白字符的目的是确保文件名与返回的文件类型两列保持对齐)。

-p, --preserve-date  在支持utime(2)或utimes(2)的系统中,保持考察的文件的最近访问时间不变。

-r, --raw  禁止把不可打印的字符表示为“\nnn”形式的八进制数值。通常,file命令会把不可打印的字符转换成上述的八进制数值表示。

-s, --special-files  通常,file只会尝试考察参数文件中能够由stat(2)确定为普通文件的文件类型,这将防止读取特殊文件时引起的潜在问题。“-s”选项导致file也会考察块或字符特殊文件。这个选项主要用于确定原始磁盘分区(块特殊文件)的文件系统类型。

-z, --uncompress  尝试考察压缩文件中的文件。

--mime-type, --mime-encoding  类似于“-i”选项,但仅显示指定的元素。

应用实例

1. 查询指定文件的类型。

# file mf.c /usr/bin/file /dev/sda
mf.c:           ISO-8859 C program text
/usr/bin/file:  ELF 32-bit LSB executable, Intel 80386, version 1 …
/dev/sda:       block special
#

2. 查询文件系统分区的数据类型。

# file -s /dev/sda{,1,2,3,4,5}
/dev/sda:  x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x7, active, starthead 1, startsector 63, 40965687 sectors; partition 2: ID=0x7, start head 0, startsector 40965750, 57335985 sectors; partition 3: ID=0x83, starthead
254, startsector 98301952, 1024000 sectors; partition 4: ID=0x5, starthead 254,
startsector 99325952, 56975360 sectors, code offset 0x48
/dev/sda1: x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", …
/dev/sda2: x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", …
/dev/sda3: Linux rev 1.0 ext4 filesystem data (needs journal recovery) …
/dev/sda4: x86 boot sector; partition 1: ID=0x8e, starthead 254, …
/dev/sda5: LVM2 (Linux Logical Volume Manager) , …
#

3. 使用mine类型定义说明文件内容的类型。

# file –i mf.c /usr/bin/file /dev/sda
mf.c:           text/x-c; charset=iso-8859-1
/usr/bin/file:  application/x-executable; charset=binary
/dev/sda:       application/x-block-device; charset=binary
#

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z