file — 确定文件类型
概要
file [-bcdEhiklLNnprsSvzZ0] [--apple] [--exclude-quiet] [--extension] [--mime-encoding]
[--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] [-P name=value]
file ...
file -C [-m magicfiles]
file [--help]
描述
此手册页记录了 file 命令的版本 5.46。
file 尝试对每个参数进行分类。它执行三个测试集,顺序如下:文件系统测试、magic 测试和语言测试。第一个成功的测试将导致打印文件类型。
打印的类型通常包含以下词语之一:text(文件仅包含可打印字符和一些常见的控制字符,并且可能可以在 ASCII 终端上安全地读取)、executable(文件包含编译的程序的结果,该程序可以被某些 UNIX 内核或其他程序理解)或 data(表示其他任何内容,通常是“二进制”或不可打印数据)。例外情况是已知的文件格式(核心文件、tar 存档),这些文件被已知包含二进制数据。在修改 magic 文件或程序本身时,请确保保留这些关键字。用户依赖于知道目录中的所有可读文件都将打印“text”一词。不要像 Berkeley 所做的那样,将“shell commands text”更改为“shell script”。
文件系统测试基于检查 stat(2) 系统调用的返回值。该程序会检查文件是否为空,或者它是否是某种特殊文件。如果定义在系统头文件 <sys/stat.h> 中,则任何适当于您正在运行的系统的已知文件类型(套接字、符号链接或命名管道(FIFO))将被推断出来。
magic 测试用于检查具有特定固定格式的数据文件。最典型的例子是二进制可执行文件(编译程序)a.out 文件,其格式在 <elf.h>、<a.out.h> 甚至 <exec.h>(位于标准 include 目录中)中定义。这些文件在靠近文件开头的特定位置存储一个“magic 数字”,它告诉 UNIX 操作系统该文件是一个二进制可执行文件,以及它是哪种类型。通过扩展,“magic 数字”的概念也适用于数据文件。任何在文件中的小固定偏移处具有一些不变标识符的文件通常可以使用这种方式进行描述。用于标识这些文件的信息从 /etc/magic 和编译的 magic 文件 /usr/share/misc/magic.mgc 读取,或者如果编译的文件不存在,则从目录 /usr/share/misc/magic 读取。此外,如果存在 $HOME/.magic.mgc 或 $HOME/.magic,它将优先于系统 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文件被识别为“文本”,因为它们几乎可以在任何终端上都能被读取;UTF-16和EBCDIC只是“字符数据”,因为虽然它们包含文本,但该文本需要进行转换才能被读取。
此外,file还会尝试确定文本类型文件的其他特征。如果文件的行以CR、CRLF或NEL结尾,而不是Unix标准的LF,则会报告这一点。包含嵌入式转义序列或重叠字符的文件也将被识别。
一旦file确定了文本类型文件中使用的字符集,它将尝试确定该文件是用什么语言编写的。语言测试会查找可以在文件的前几个块中的任何位置出现的特定字符串(参见[names.h])。例如,关键字.br表示该文件很可能是troff(1)输入文件,就像关键字struct表示C程序一样。这些测试不如前两组测试可靠,因此它们是最后执行的。语言测试例程还会测试一些杂项内容(例如tar(1)归档文件、JSON文件)。
任何无法识别为使用上述字符集中任何一种编写的文件,都将被简单地标记为“数据”。
选项
--apple
导致file命令输出旧版MacOS中使用的文件类型和创建者代码。该代码由八个字母组成,第一个描述文件类型,后七个描述创建者。此选项仅对具有苹果风格输出定义的文件格式有效。
-b, --brief
不要在输出行的开头添加文件名(简短模式)。
-C, --compile
写入magic.mgc输出文件,其中包含魔术文件或目录的预解析版本。
-c, --checking-printout
导致打印魔术文件的解析形式的检查输出。通常,这与-m选项一起使用,以调试新的魔术文件,然后再安装它。
-d
将内部调试信息打印到stderr。
-E
在文件系统错误(文件未找到等)发生时,file不再像POSIX所要求的那样将错误作为常规输出处理并继续执行,而是输出错误消息并退出。
-e, --exclude testname
从用于确定文件类型的测试列表中排除名为 testname 的测试。有效的测试名称包括:
apptype EMX 应用程序类型(仅在 EMX 上)。
ascii 各种类型的文本文件(此测试将尝试猜测文本编码,而与“encoding”选项的设置无关)。
encoding 用于软魔术测试的不同文本编码。
tokens 为了向后兼容而被忽略。
cdf 打印复合文档文件的详细信息。
compress 检查并查看压缩文件。
csv 检查逗号分隔值文件。
elf 如果启用了软魔术测试并找到了 elf 魔术,则打印 ELF 文件详细信息。
json 通过解析 JSON (RFC-7159) 文件以检查其是否符合规范。
soft 查阅魔术文件。
simh 检查 SIMH 磁带文件。
tar 通过验证 512 字节 tar 标头的校验和来检查 tar 文件。排除此测试可以提供更详细的内容描述,方法是使用软魔术方法。
text “ascii”的同义词。
--exclude-quiet
类似于 --exclude,但忽略文件不了解的测试。这旨在与旧版本的 file 兼容。
--extension
打印文件类型找到的有效扩展名的以斜杠分隔的列表。
-F, --separator separator
使用指定的字符串作为文件名和文件结果之间返回的分隔符。默认值为“:”。
-f, --files-from namefile
从 namefile(每行一个)中读取要检查的文件名,然后再处理参数列表。namefile 或至少一个文件名参数必须存在;要测试标准输入,请将“-”用作文件名参数。请注意,namefile 将被解包,并且在遇到此选项时会处理其中的文件名,然后再处理任何进一步的选项。这允许使用不同的命令行参数处理同一文件调用的多个文件列表。因此,如果您想设置分隔符,则需要在指定文件列表之前执行此操作,例如:“-F @ -f namefile”,而不是:“-f namefile -F @”。
-h, --no-dereference
此选项导致不跟踪符号链接(在支持符号链接的系统上)。如果未定义环境变量 POSIXLY_CORRECT,则这是默认设置。
-i, --mime
导致文件命令输出 mime 类型字符串,而不是更传统的可读字符串。因此,它可能会显示“text/plain; charset=us-ascii”,而不是“ASCII 文本”。
--mime-type, --mime-encoding
类似于 -i,但仅打印指定的元素。
-k, --keep-going
不要在第一个匹配项处停止,继续进行。后续匹配项将在前面附加字符串“\012- ”。(如果您想要一个换行符,请参阅 -r 选项。)魔术模式的强度最高(请参阅 -l 选项)。
-l, --list
显示模式列表及其强度,按 magic(5) 强度降序排列,magic(5) 强度用于匹配(另请参阅 -k 选项)。
-L, --dereference
此选项导致符号链接被跟随,类似于 ls(1) 中的同名选项(在支持符号链接的系统上)。如果定义了环境变量 POSIXLY_CORRECT,则默认启用此选项。
-m, --magic-file magicfiles
指定备用的文件和目录列表,这些文件和目录包含 magic 数据。这可以是一个项目,也可以是一个冒号分隔的列表。如果与文件或目录一起找到编译后的 magic 文件,则将使用它。
-N, --no-pad
不要填充文件名,以便在输出中对齐。
-n, --no-buffer
强制在检查每个文件后刷新 stdout。只有在检查文件列表时才有用。它旨在用于希望从管道获取文件类型输出的程序。
-p, --preserve-date
在支持 utime(3) 或 utimes(2) 的系统上,尝试保留已分析文件的访问时间,以假装从未读取该文件。
-P, --parameter name=value
设置各种参数限制。
名称 默认值 说明 bytes 1M 从文件中读取的最大字节数 elf_notes 256 处理的最大 ELF 注释数 elf_phnum 2K 处理的最大 ELF 程序段数 elf_shnum 32K 处理的最大 ELF 段数 elf_shsize 128MB 处理的最大 ELF 段大小 encoding 65K 确定编码时使用的最大字节数 indir 50 间接 magic 的递归限制 name 100 name/use magic 的使用计数限制 regex 8K 正则表达式搜索的长度限制
-r, --raw
不要将不可打印的字符转换为 \ooo。通常,file 会将不可打印的字符转换为其八进制表示形式。
-s, --special-files
通常,file 仅尝试读取并确定参数文件的类型,这些文件 stat(2) 报告为普通文件。这可以防止出现问题,因为读取特殊文件可能会产生奇怪的后果。指定 -s 选项会导致 file 也读取参数文件,这些文件是块或字符特殊文件。这对于确定原始磁盘分区中数据的文件系统类型很有用,这些分区是块特殊文件。此选项还会导致 file 忽略 stat(2) 报告的文件大小,因为在某些系统上,它会报告原始磁盘分区的大小为零。
-S, --no-sandbox
在可以使用 libseccomp(https://github.com/seccomp/libseccomp)的系统上,-S 选项可禁用默认启用的沙盒。当指定 -z 选项并且内置解压缩程序不可用时,需要此选项才能执行外部解压缩程序。在沙盒不可用的系统上,此选项不起作用。
注意:此 Debian 版本的程序是在没有 seccomp 支持的情况下构建的,因此此选项无效。
-v, --version
打印程序版本并退出。
-z, --uncompress
尝试查看压缩文件的内容。
-Z, --uncompress-noreport
尝试查看压缩文件的内容,但不报告有关内容的信息,仅报告压缩信息。
-0, --print0
在文件名末尾输出一个空字符“\0”。 方便与 [cut]({filename}../../cut)(1) 命令一起使用。
这不会影响分隔符,分隔符仍然会被打印。
如果此选项重复出现多次,则 file 命令将为每个条目打印文件名,后跟一个 NUL 字符,然后是描述(或 ERROR: 文本),最后再跟一个 NUL 字符。
--help 打印帮助消息并退出。
环境
环境变量 MAGIC 可用于设置默认 magic 文件名。 如果设置了该变量,则 file 命令将不会尝试打开 $HOME/.magic。 file 命令会将 “.mgc” 添加到此变量的值中(如果需要)。 环境变量 POSIXLY_CORRECT 控制(在支持符号链接的系统上),file 命令是否尝试跟踪符号链接。 如果设置,则 file 命令会跟踪符号链接;否则,它不会跟踪。 这也由 -L 和 -h 选项控制。
文件
/usr/share/misc/magic.mgc 默认的编译后的 magic 列表。
/usr/share/misc/magic 包含默认 magic 文件的目录。
退出状态
如果操作成功,file 命令将以 0 退出;如果遇到错误,则以 >0 退出。 以下错误会显示诊断消息,但不会影响程序的退出代码(如 POSIX 所要求),除非指定了 -E 选项: 无法找到文件 没有读取文件的权限 无法确定文件类型
示例
$ 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)
标准兼容性
此程序被认为超出了 System V 接口定义的 FILE(CMD) 的范围,就其含糊的语言而言,这一点可以确定。 但是,它的行为与同名的 System V 程序基本兼容。 但是,此版本了解更多的 magic 信息,因此在许多情况下,它会产生不同的(但更准确的)输出。
此版本与 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
安全性
在系统上,如果可以使用 libseccomp [https://github.com/seccomp/libseccomp],file 命令会强制限制系统调用,使其仅限于程序操作所需的系统调用。但是,当使用 -z 选项请求 file 命令解压缩输入文件并运行外部程序时,此强制措施不会提供任何安全优势。要启用外部解压缩器的执行,需要使用 -S 选项禁用沙盒机制。
魔术目录
魔术文件条目已从各种来源(主要是 USENET)收集,并由各种作者贡献。Christos Zoulas(如下地址所示)将收集其他或更正后的魔术文件条目。魔术文件条目的合并版本将定期分发。
魔术文件中条目的顺序非常重要。根据您使用的系统,条目的组合顺序可能会不正确。
历史
自至少 Research Version 4(手册页日期为 1973 年 11 月)以来,每个 UNIX 系统都存在 file 命令。System V 版本引入了一个重要的主要更改:外部魔术类型列表。这稍微降低了程序的运行速度,但使其更加灵活。
此程序基于 System V 版本,由 Ian Darwin ⟨_\⟩ 编写,且没有参考任何其他人的源代码。
John Gilmore 大幅度修改了代码,使其优于第一个版本。Geoff Collyer 发现了一些不足之处,并提供了一些魔术文件条目。Rob McMahon ⟨_\⟩ 于 1989 年贡献了“&”运算符。
Guy Harris ⟨_\⟩ 从 1993 年至今进行了许多更改。
从 1990 年至今,Christos Zoulas ⟨_\⟩ 负责主要的开发和维护。
Chris Lowth ⟨_\⟩ 于 2000 年进行了修改:处理 -i 选项,以输出 mime 类型字符串,使用替代的魔术文件和内部逻辑。
由 Eric Fischer ⟨_\⟩ 修改,于 2000 年 7 月,用于识别字符代码,并尝试 识别非 ASCII 文件的语言。
由 Reuben Thomas ⟨_\⟩ 修改,于 2007-2011 年,以改进 MIME 支持,合并 MIME 和非 MIME 规则,支持目录以及文件规则,应用许多错误修复,更新和修复 许多规则,改进构建系统,改进文档,并将 Python 绑定重写为纯 Python。
‘magic’ 目录(magic 文件)的贡献者列表太长,无法在此处列出。 您 知道是谁,谢谢。 许多贡献者在源代码文件中列出。
法律声明
版权 (c) Ian F. Darwin, 加拿大,多伦多,1986-1999。 受到标准 Berkeley 软件分发版权的保护;请参阅源代码分发中的 COPYING 文件。
文件 tar.h 和 is_tar.c 由 John Gilmore 从他的公共领域 tar(1) 程序编写, 不受上述许可的约束。
错误
请将错误报告和补丁发送到 bug 跟踪器 https://bugs.astron.com/ 或邮件 列表 ⟨_⟩(请先访问 https://mailman.astron.com/mailman/listinfo/file 订阅)。
TODO
修复输出,以便无需在所有地方进行 MIME 和 APPLE 标志的测试,并且实际 输出仅在一个地方完成。 这需要一个设计。 建议:将可能的输出推送到一个列表,然后在最后选择最后一个推送(希望是最具体的)值,或者在列表为空时使用默认值。 这不应降低评估速度。
处理 MAGIC\_CONTINUE 和在条目之间打印 \012- 的方式既笨拙又复杂;
重构并集中处理。
一些编码逻辑是硬编码在 encoding.c 中,如果我们可以使用 !:charset 注释,则可以将其移动到 magic 文件中。
继续修复所有 magic 错误。 请参阅 Debian BTS 以获取一个很好的来源。
存储任意长度的字符串,例如用于 %s 模式,以便可以将其打印出来。 修复 Debian bug #271672。 可以通过在字符串池中分配字符串,将字符串池存储在 magic 文件的末尾,并将所有字符串指针转换为相对于字符串池的相对偏移量来完成。
添加相对于当前级别的相对偏移量的语法(Debian bug #466037)。
使 file -ki 正常工作,即提供多个 MIME 类型。
添加一个 zip 库,以便我们可以窥视 Office2007 文档的内部,以打印更多关于其 内容的信息。
添加一个选项以打印文件描述的来源 URL。
组合脚本搜索并添加一种将可执行文件名映射到 MIME 类型的方法(例如,为 !:mime 赋予一个 magic 值,该值导致结果字符串在表中查找)。 这将避免为每个新的 shebang 解释器重复添加相同的 magic。
当可用文件描述符时,我们可以跳过并调整缓冲区,而不是我们现在所做的 hacky 缓冲区管理。
修复“name”和“use”,以便在编译时检查一致性(重复的“name”,或“use”指向未定义的“name”)。通过维护一个排序的名称列表,使“name”/“use”更加高效。 对“^”进行特殊处理,使其在解析器中翻转字节序,这样就不需要对其进行转义,并记录此功能。
如果文件中指定的内部偏移量超过了缓冲区大小(file.h 文件中的 HOWMANY 变量),则我们不会移动到该偏移量,而是直接放弃。 最好在文件描述符可用时进行缓冲区管理,这样我们就可以在文件中进行寻址操作。 但是,必须小心,因为这涉及到性能,从而也涉及安全性问题,因为可以通过重复寻址来降低性能。
现在支持维护单独的缓冲区,并使用从文件末尾开始的偏移量,但内部缓冲区管理仍然需要进行改进。
可用性
您可以从 ftp.astron.com 的 /pub/file/file-X.YZ.tar.gz 目录中通过匿名 FTP 获取作者的最新版本。