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 獲得作者的命令的最新版本

[中文版維護人]
姓名 <email>

[中文版最新更新]
2001/07/15

《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh