FILE(1) | General Commands Manual | FILE(1) |
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'類型.
/usr/share/magic - 默認的幻數列表
環境變量 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
幻數文件項主要是從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
http://cmpp.linuxforum.net
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
Copyright but distributable |