确定文件的类型
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