Linux file ( file ) 命令用于确定、查看文件的类型。

file 命令的定义解释

file 命令用于确定、查看、辨识文件的类型。它对每个参数执行一系列测试。这些测试包括文件系统测试、幻数测试和语言测试。第一个成功的测试确定文件类型。

文件系统测试使用 stat 系统调用来识别文件的属性,例如大小和其他参数。幻数测试识别文件的幻数并确定文件类型。幻数是在文件开头找到的字节序列,指示文件类型。

语言测试根据特定的模式和签名识别文件类型。它搜索可能出现在文件前几个块中的特定字符串,以识别文件类型。

file 命令语法

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 必须提供,选项是除 -C --help 之外的所有参数
  • 第二种语法形式:选项 -C 必须提供
  • 第三种语法形式:选项 --help 可选,不提供 --help 选项时,显示基本的语法信息

file 命令使用示例

1、只查看文件按类型,可以不使用任何选项:

file file1

输出内容:

file1: ASCII text

这中形式对于查看没有扩展名的文件的类型非常的有帮助。

2、使用 -b 选项,在输出信息中不显示文件名:

file file1

输出内容:

ASCII text

3、使用 -s 选项,显示块设备的附加信息

sudo file -s /dev/sda

输出信息:

/dev/sda: DOS/MBR boot sector

注:本信息因为在虚拟机中,没有显示出附加信息。

Displaying the MIME Type and MIME Encoding

4、使用 -i 选项,显示 MIME 类型和 MIME 编码

file -i file1.txt

输出信息:

file1.txt: text/plain; charset=us-ascii

file 命令选项解释

如下给出了 Linux file 命令中所有选项的解释说明:

选项 解释说明
--apple 使 file 命令输出旧 MacOS 版本使用的文件类型和创建者代码。代码由八个字母组成,第一个字母描述文件类型,第二个字母描述创建者。此选项仅适用于定义了 apple 样式输出的文件格式。
-b, --brief 不在输出行前加上文件名(简短模式)
-C, --compile 写入一个包含幻数文件或目录的预解析版本的 magic.mgc 输出文件。
-l, --verbose 输出字节数和不同的字节值
-c, --checking-printout 引起幻数文件的解析形式的验证打印结果。这通常与 -m 选项一起使用,用于在安装新幻数文件之前调试它。
-d 将内部调试信息打印到 stderr
-E 对于文件系统错误(未找到文件等),不像 POSIX 要求的那样将错误作为常规输出处理并继续,而是发出错误消息并退出。
-e, --exclude testname 排除对于 testname 中包含的文件类型的测试。有效的测试名称包含:
apptype:EMX 应用类型(仅在 EMX 上使用)
ascii:各种类型的文本文件(此测试将尝试猜测文本编码,而不考虑 encoding 选项的设置)
encoding:对于软幻数测试的不同文本编码。
tokens:忽略向后兼容
cdf:输出复合文档文件(Compound Document Files)的详细信息。
compress:检查并查看压缩文件
csv:检查 CSV 文件
elf:输出 ELF 文件详细信息,前提是启用了软幻数测试并找到了 elf 幻数。
 json:使用 JSON (RFC-7159)来检查文件的合规性
soft:查阅幻数文件
tar:通过验证 512 字节的 tar 头的校验和来检查 tar 文件,排除此测试可以使用软幻数方法提供更详细的内容描述
text:等同于 ascii
--exclude-quiet 比如:排除但忽略文件不知道的测试。这是为了与旧版本的文件兼容。
--extension 输出找出的文件类型的有效扩展名的以斜杠分隔的列表
-F, --separator separator 使用指定的字符串作为文件名和返回的文件结果之间的分隔符。默认为‘:’
-f, --files-from namefile 从参数列表之前的 namefile 中读取要检查的文件的名称(每行一个)。必须存在 namefile 或至少一个文件名参数;要测试标准输入,请使用 - 作为文件名参数。请注意,当遇到此选项时,在进行任何进一步的选项处理之前,将对 namefile 展开并处理所包含的文件名。这允许在同一个文件调用中使用不同的命令行参数处理多个文件列表。因此,如果您想设置分隔符,则需要在指定文件列表之前进行设置,例如:-F @ -F namefile,而不是:-F namefile -F @
-h, --no-dereference 此选项导致不检查符号链接(在支持符号链接的系统上)。如果没有定义环境变量 POSIXLY_CORRECT,这是默认值。
-i, --mime 使 file 命令输出 mime 类型字符串,而不是更传统的人类可读字符串。因此,它可能会输出 text/plain; charset=us-ascii 而不是 ASCII text
--mime-type, --mime-encoding 与-i类似,但只输出指定的内容。
-k, --keep-going 不要止步于第一次匹配,继续进行。随后的匹配将在前面加上字符串 \012-。(如果需要换行符,请参见 -r 选项。)具有最高优势的幻数模式(参见 -l 选项)最先出现。
-l, --list 按匹配的 magic 强度的降序排序显示模式列表及其强度(另见 -k 选项)。
-L, --dereference (在支持符号链接的系统上)选项显示符号链接文件的原文件, 就像 ls 命令的 like-named 选项。如果定义了环境变量 POSIXLY_CORRECT,这是默认值。
-m, --magic-file magicfiles 指定包含 magic 的文件和目录的备选列表。它可以是单个项目,也可以是以冒号分隔的列表。如果伴随着文件或目录找到已编译的幻数文件,则将使用它。
-N, --no-pad 不填充文件名以便它们在输出中对齐。
-n, --no-buffer 每检查完一个文件就强制刷新标准输出. 仅在检查一组文件时才有效. 一般在将文件类型输出到管道时才采用此选项。
-p, --preserve-date 在支持 utimeutimes 的系统上,尝试保留所分析文件的访问时间,假装文件从未读取过。
-P, --parameter name=value 设置各种参数限制。参数包含以下三列信息:
  名称    默认值    解释说明
  bytes  1048576  从文件中读取的最大字节数
  elf_notes  256  处理的最多 256 个 ELF 注释
  elf_phnum  2048  处理的最大 ELF 程序段数
  elf_shnum  32768  处理的最大 ELF 段数
  encoding  65536  编码评估扫描的最大字节数
  indir  50  间接幻数的递归限制
  name  50  名称/用途 幻数使用计数限制
  regex  8192  正则表达式搜索的长度限制
-r, --raw 不要将不可打印的字符翻译成 0。通常,文件将不可打印的字符转换为其八进制表示。
-s, --special-files 通常, file 只是试图去检查在文件列表中那些 stat 报告为正常文件的文件的类型。由于读特殊文件将可能导致不可知后果,所以这样可以防止发生问题。使用 -s 选项时 file 命令也将去读文件列表中的块特殊文件和字符特殊文件。一般用于从原始磁盘分区中获得文件系统类型,此文件为块 特殊文件。这个选项也导致 file 命令忽略 stat 报告的文件大小,因为在有些系统中原始磁盘分区的大小报告为 0。
-S, --no-sandbox 在支持 libseccomp 的系统上,-S 选项禁用默认启用的沙箱。当执行外部解压缩程序需要使用该选项,例如:当指定了 -z 选项且内置解压缩程序不可用时。在沙箱不可用的系统上,此选项不起作用。
-v, --version 输出版本信息并退出
-z, --uncompress 尝试查看压缩文件
-Z, --uncompress-noreport 尝试查看压缩文件的内容,但只报告有关内容的信息,而不是关于压缩的信息。
-0, --print0 在文件名结束后输出一个空字符 \0。对于 cut 输出很有用。这不会影响分隔符,分隔符仍然打印。
--help 打印帮助信息并退出

结语

在本教程中我们介绍了如何使用 file ( file ) 命令确定、查看、辨识文件的类型它对每个参数执行一系列测试。这些测试包括文件系统测试、幻数测试和语言测试。第一个成功的测试确定文件类型。

该 file 命令可以在 Linux 系统中使用,也可以在 FreeBSD 系统中使用。