FILE(1)

NAME
file - 确定文件类型

总览
file [ -bcnsvzL ] [ -f 命名文件 ] [ -m 幻数文件 ] file ...

描述
本手册页说明了3.27版本 file 命令的使用. File 命令试图检查每个参数以判定文件的类型. 检查共有三组，按如下顺序进行:文件系统检查，幻数检查，以及语言检查. 文件系统 检查成功则输出文件类型.

输出的类型一般会包含以下的词中的一个： text (文件中仅有 ASCII 字符，可以用 ASCII 终端读此文件，以保证内容的可靠性), executable (文件中保存的是程序编译后的结果，一些UNIX 内核或其它内核能理解这类文件), 或者 data 表示所有其它类型文件(data 一般为二进制文件或者不可打印的). 但是有的常用的文件格式（如core文件、tar包），虽然也包含二进制数据， 却不属于这一类 如果要修改 /usr/share/magic 或者程序本身, preserve these keywords . 当文件为``text'' 类型时，认为此文件为可读文件. 不要象在Berkeley环境中那样做 - 要把``shell commands text''改为``shell script''.

文件系统检查是建立在对 stat(2) 系统调用结果的分析上的. 程序会分析文件是否为空,或者是否是某种特殊文件. 对于所有可在现有系统上使用的文件类型 (比如套接 口文件，动态链接文件，命名管道文件(FIFOs) 等)， 只要它在系统头文件 sys/stat.h 中已经定义过，就可以被检查到.

幻数检查用来检查文件中是否有特殊的固定格式的数据. 规范的例子如二进制可执行文件(编译后的程序) a.out ,该文件格式在标准include目录下的 a.out.h 文件中定义，也可能在 exec.h 中定义. 这些文件在文件开始部分附近的一个特殊位置保存有一个'幻数' , 通过幻数告诉UNIX 操作系统此文件是二进制可执行文件, 和其中包含的其它类型. 幻数的概念已经扩展到数据文件.任何在文件固定位置有与文件类型 相关的不变标识符的文件都可以这样表示. 这些文件中的信息可以 从幻数文件 /usr/share/magic 中读取.

如果文件为 ASCII 文件, file 会试图检查它的语言. 语言检查在文件开始的几个块中(任意位置)查找是否有特殊字符串(参看 names.h) 例如，关键字 .br 指出此文件很可能是 troff(1) 输入文件, 而关键字 struct 指出此文件是C程序. 语言检查不如前两组检查可靠，所以放在最后执行.它也用来检查 一些混合文件(例如 tar(1) 存档文件)并确定文件是`ascii text'类型还是`data'类型.

选项

-b  不输出文件名 (简要模式).

-c  检查时打印输出幻数文件的解析结果.常与 -m 一起使用，用来在安装幻数文件之前调试它.

-f 命名文件
    从在参数表前的 命名文件 中读出将要检查的文件名(每行一个文件).要有 命名文件 ，或者至少有一个文件名参数; 如果要检查标准输入, 使用``-''作为文件参数.

-m list
    指定包含幻数的文件列表.可以是单个文件，也可以是 用冒号分开的多个文件.

-n  每检查完一个文件就强制刷新标准输出. 仅在检查一组文件时才有效. 一般在将文件类型输出到管道时才采用此选项.

-v  打印程序版本并退出.

-z  试图查看压缩文件内部信息.

-L  (在支持符号链接的系统上)选项显示符号链接文件的原文件, 就像 ls(1) 命令的like-named 选项.

-s  通常, file 只是试图去检查在文件列表中那些 stat(2) 报告为正常文件的文件的类型.由于读特殊文件将可能导致 不可知后果，所以这样可以防止发生问题.使用 -s 选项时 file 命令也将去读文件列表中的块特殊文件和字符特殊文件. 一般用于从原始磁盘分区中获得文件系统类型，此文件为块 特殊文件. 这个选项也导致 file 命令忽略 stat(2) 报告的文件大小，因为在有些系统中原始磁盘分区的大小报告为0.

文件
/usr/share/magic - 默认的幻数列表

ENVIRONMENT
环境变量 MAGIC 用于设置默认的幻数文件.

参看
magic(4) - 幻数文件的格式.
strings(1), od(1), hexdump(1) - 检查非textfile的工具.

标准的一致性
本程序比System V 的FILE命令强大, 几乎能分辨出所有的模糊语言. 与System V 的FILE命令大部分兼容.本版本能识别更多的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

SunOS releases 3.2及以后的版本包括从System V 发展来的 file(1) 命令,但有所扩展.本版本与Sun的file命令差别不大.它包括对 `&' 操作符的扩展,例如,
>16    long&0x7fffffff    >0    not stripped

MAGIC DIRECTORY
幻数文件项主要是从USENET收集来的,许多人都为此作出了贡献. Christos Zoulas (下边将提到的)将收集附加项信息及修正幻数文件项. 幻数文件项的合并表将会定时发布.

幻数文件项的顺序非常重要.不同的系统上的幻数项放的顺序可能不同. 如果老的 file 命令使用幻数文件，请将旧的幻数文件改名保存， (如改为 /usr/share/magic.orig) 以便日后做比较用.

举例
$ file file.c file /dev/hda
file.c:   C program text
file:     ELF 32-bit LSB executable, Intel 80386, version 1,
dynamically linked, not stripped
/dev/hda: block special
$ 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

历史
There has been a file 命令至少是从研究版本6(手册页时间为1975年1月)开始加入UNIX中的. System V 版本引入了一个重要变化:幻数类型的外部表.程序的运 行时间有轻微下降, 但是复杂性大大增加了.

本程序是基于System V 版本的,由Ian Darwin独立设计和编写.

John Gilmore对源代码做了较大修改,在第一版基础上有较大提高. Geoff Collyer发现了一些不足之处，并提供了一些幻数文件项. 本程序一直在完善中.

作者
由Ian F. Darwin写源码, UUCP 地址 {utzoo | ihnp4}!darwin!ian, 电子邮件 ian@sq.com, 邮寄地址: P.O. Box 603, Station F, Toronto, Ontario, CANADA M4Y 2L8.

由Rob McMahon修改, cudcv@warwick.ac.uk, 1989, 并对`&'操作符进行了扩充 （不再仅仅是简单的 `x&y != 0'，而是象`x&y op z'这样）.

由Guy Harris修改, guy@netapp.com, 1993,完成:

    恢复``old-style'' `&' 操作符为原来的功能,因为 1) Rob McMahon所做的修改打破了原来的使用方式, 2) 本版本的 file 命令支持的SunOS 的``new-style'' `&' 操作符也处理 `x&y op z', 3) Rob的修改对某些情况没有考虑到;

    引入多级`>';

    引入``beshort'', ``leshort'', 等关键字使得程序能够按照一定的比特顺序 查看文件中的比特数，而不是仅按运行 file 时的本地比特顺序查看.

由Ian Darwin和其他作者（包括Christos Zoulas(christos@astron.com)）修改, 1990-1999.

合法性通告
版权所属 (c) Ian F. Darwin, Toronto, Canada, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993.

本软件独立于美国电话电报公司，Sun微系统公司，Digital设备公司, Lotus发展公司 , California大学董事会，X联盟或者MIT,或者自由软件基金会.

本软件独立于美国商业部的任何出口规定,可以自由用于任何国家和行星.

任何人无需授权即可在任何计算机系统上使用此软件用于任何目的， 可以自由修改和发布，但要遵守以下限制:

1. 作者对使用此软件造成的任何后果不负任何责任，无论多么严重， 即使这些后果是由于软件造成的.

2. 禁止不如实说明本软件的来源，无论是明确说错或是忽略. 由于很少有用户读源码, 所以在文件中一定要说明软件来源.

3. 修改后的版本必须明白的标明，禁止将其作为原始软件.由于很少有用户读源码, 所以在文件中一定要说明软件来源.

4. 禁止删除或修改本通告.

随同本包发布的几个支持文件(getopt, strtok)由 Henry Spencer完成，同样适用以上条款.

随同本包发布的几个支持文件(strtol, strchr)属于公共域的;都做了标记.

文件 tar.h 和 is_tar.c 由 tar 程序组的John Gilmore完成,无需遵从以上条款.

臭虫
必定存在一种更好的方法来根据Magdir中的glop来自动创建Magic 文件.是什么方法呢?要更好的实现，那么幻数文件应该编译成二进制 (就是说， ndbm(3) 或者, 在异种网络环境中采用定长的 ASCII 字符串)来加快启动速度.这样，程序就能达到Version 7 中的 file命令那样的运行速度,同时又具有System V 版本的灵活性.

File 使用的一些算法虽然提高了速度，但精确性降低了，因此 在对 ASCII 文件内容操作有时会出错.

对 ASCII 文件的支持(基本上是对编程语言)过于简单,效率较低，需要重新编译并更新.

在一系列连续行后应该跟着有一个``else''从句.

幻数文件和关键词应该有正则表达式的支持. 使用 ASCII TAB 作为分隔符非常不足取，导致很难编辑文件, 但也因此受到保护.

在关键词中使用大写字母是可取的. 例如, troff(1) 命令与查看手册页的宏. 正则表达式支持将使这易于实现.

本程序没有实现对 FORTRAN 的理解. 应该能够通过在开始行中出现的关键字识别出FORTRAN . 正则表达式支持将使这易于实现.

文件 ascmagic 中的关键词表可能应归入Magic文件. 这能通过使用象`*'这样的关键词来实现偏移量.

另一个优化是要对幻数文件排序，这样，我们就可以 在取得第一个比特，第一个词，第一个长整型，等等的时候完成 对它们所有的检查.抱怨在幻数文件项中的冲突.制定一条规则， 将幻数项在文件偏移量的基础上排序，胜过在幻数文件里指定位置吗？

本程序应提供一种方法来评价一种猜测有"多么好". 我们去除了一些先前的设想(如，将 ``From '' 作为文件的最初5个字符) 因为它们不如其它的设想好(如，``Newsgroups:'' 对"Return-Path:"). 如果没有其它的设想提出，就很可能会采纳第一种设想.

本程序比某些file命令执行速度慢.

本手册，特别是本部分，比较长.

可用性
可以通过匿名FTP登陆到 ftp.astron.com 在目录下 /pub/file/file-X.YY.tar.gz 获得作者的命令的最新版本

TRANSBY
LinuxForum.Net CMPP 中文手册页计划 http://cmpp.linuxforum.net

* Sun Jul 15 2001 NONAME <NONAME@NOWHERE>
- 初始版本