FILE(1)

名称
file - ファイルの種類を判定する

書式
file [-vczL] [-f namefile] [-m magicfiles] file ...

解説
このマニュアルは file コマンドのバージョン 3.22 について記載しています。 file は、namefile で指定されたファイルの種類を判定するプログラムです。判定の ために、ファイルシステムテスト、マジックナンバテスト、言語テストの 3 つのテストをこの順に実行し、 最初に 判定できた結果からファイルの種類を表示します。

ファイルの種類として表示されるのは、 text ( ASCII キャラクタだけのファイルで、 ASCII 端末に表示した場合、 問題が起こらないもの)、 executable ( UNIX カーネル等に理解可能な形にコンパイルされたプログラムを 含むファイル)、その他のものを意味する data (data は、通常 `バイナリ' か表示不能なもの) のうちの 1 つです。 例外は、内部フォーマットがよく知られた、 バイナリデータを含むファイル (コアファイルや tar アーカイブ) です。 ファイル /usr/share/misc/magic やプログラムそのものを変更するときは、 これらのキーワードを残して下さい 。

ディレクトリ内のすべての可読なファイルは、 単語 ``text'' を表示することが期待されています。 Berkeley で行われたように、``shell commands text'' を ``shell script'' と変更するようなことはしないで下さい。

ファイルシステムテストは、 stat(2) システムコールからの戻り値を調べることに基づいています。 このプログラムは、ファイルが空であるかどうか、ある種の 特殊ファイルであるかどうかを調べます。 使っているシステムに合った既知のファイルの種類 (システムに実装されたソケット、シンボリックリンク、 名前付きパイプ (FIFO)) は、システムヘッダファイル sys/stat.h で定義されていれば表示されます。

マジックナンバテストは、ファイルが固定フォーマットのデータであるか どうかをチェックするために使われます。 よい例が、実行可能なバイナリ実行形式 (コンパイルされたプログラム) a.out ファイルです。このフォーマットは標準インクルードディレクトリ内の a.out.h や場合により exec.h で定義されています。 実行ファイルは、 ファイルの先頭近くの特定の場所に、`マジックナンバ' を持ちます。 これは UNIX オペレーティングシステムに対し、 ファイルがバイナリ実行形式であり、 どのタイプの実行可能ファイルであるかを知らせます。 `マジックナンバ' の概念は拡張され、データファイルにも適用されています。 ファイルの先頭に近い固定位置に固定識別子があるファイルは、 このように記述できます。 これらのファイルの情報は、マジックファイル /usr/share/misc/magic から読み込まれます。

もしファイルが ASCII ファイルのようであるなら、 file は、その言語を推定しようとします。 言語テストは、ファイルの始めの数ブロックに 特定の文字列 ( Inames.h を参照) があるかどうかを探します。たとえばキーワード .br があればそれはおそらく troff(1) の入力ファイルであり、 struct というキーワードは、C 言語のプログラムであることを示しています。 こうした推定方法は、前述の 2 つのテストより信頼性が低いため、 最後に行われます。言語テストルーチンは ( tar(1) アーカイブのような) その他のファイルもチェックし、未知のファイルを `ascii text' とすべきか、 `data' とすべきかを決定します。

オプション

-v  プログラムのバージョンを表示して、終了します。

-m list
    マジックナンバを含む別のファイルの list を指定します。 これは、1 つのファイルか、コロン (:) で分けられたファイルのリストです。

-z  compress で圧縮されたファイルの中身を見ようとします。

-c  マジックファイルを解析した形式を、調査できるように表示します。 通常、 新しいマジックナンバファイルを使う前にデバッグするために、

-m  オプションとともに用います。

-f namefile
    引数の前に name_file から調べるべきファイル名を (1 行に 1 つ) 読み込みます。 name_file もしくは引数の filename は少なくとも 1 つは指定しなければなりません。 標準入力のファイルの種類を判定させる場合は、 ファイル名として、``-'' を指定します。

-L  オプションは(システムがシンボリックリンクを提供していれば)、 ls(1) コマンドの -L オプションと同様にシンボリックリンクをたどって実際のファイルの中 身の種類を判定します。

関連ファイル
/usr/share/misc/magic
    デフォルトのマジックナンバのリスト (以前のバージョンの FreeBSD では /etc/magic でした)

環境変数
環境変数 MAGIC は、デフォルトのマジックナンバファイルを指定するために 使うことができます。

関連項目
od(1), strings(1), magic(5)

標準適合性
このプログラムは、その中に含まれる曖昧な言語をできるだけ特定できる ようになっており、 System V の FILE(CMD) で定義されるインタフェースを越えているはずです。 同名の System V のプログラムと、ほとんど動作は同じです。 しかし、このバージョンはより多くのマジックを知っているので、多くの場合に 異なった (より正確な) 出力を出します。

このバージョンと 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(1) コマンドが含まれていますが、拡張がなされています。 このバージョンは SUN のものとは、細かい点でしか異なりません。 このバージョンには `&' 演算子の拡張が含まれています。 使い方は、次のようなものです。
>16 long&0x7fffffff >0 not stripped

マジックディレクトリ
マジックファイルのエントリは様々なソース (主に USENET) から集められたり、様々な作者から提供されました。 Chirstos Zoulas (下記のアドレス) が、 マジックファイルエントリをさらに集めたり訂正するでしょう。 統合したマジックファイルエントリは、定期的に配布されるでしょう。

マジックファイルにおけるエントリの順序は 重要です。 使っているシステムによって、エントリの順序が正しくなくなることが あります。 もし、あなたの古い file コマンドがマジックファイルを使っているのなら、 比較のため古いマジックファイルを保存して下さい (たとえば、 /usr/share/misc/magic.orig という名前に変更します) 。

歴史
file コマンドは、少なくとも Research Version 6 (マニュアルページの日付は、1975 年 1 月) からはどの UNIX にもありました。 System V バージョンはある重要な変更、 すなわち外部マジックナンバリストを導入しました。 これによってプログラムのスピードはわずかに低下しましたが、 更にまた柔軟になりました。

このプログラムは、System V バージョンを基づいており、 Ian Darwin によって、他の誰かのソースコードを見ることなく 書かれました。

John Gilmore はコードを拡張し、最初の版よりも よいものにしました。 Geoff Collyer は 不適当なところが数箇所あるのを 発見し、いくつかマジックファイルエントリを 提供しました。 プログラムは、ずっと発展し続けています。 Ian F. Darwin <ian@sq.com>, UUCP アドレス {utzoo | ihnp4}!darwin!ian, 住所 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@auspex.com> が 1993 年に、

``旧型'' の `&' 演算子を元のように戻しました。理由は、

1.  Rob McMahon の変更によりこれまでの使用法ができなくなった。

2.  このバージョンの file がサポートする SunOS の ``新型'' の `&' 演算子で、`x&y op z' も扱える。

3.  Rob の変更はドキュメントに書かれていなかった。

他段階の `>' 追加。

``beshort'', ``leshort'' などのキーワードの追加。 file が動いているプロセスのバイトオーダではなく、 ファイル特有のバイトオーダで数字を見るようにするキーワードです。

Ian Darwin や Christos Zoulas <christos@deshaw.com> を含む 多くの作者による 1990-1992 年の変更。

法律上の注意
Copyright (c) Ian F. Darwin, Toronto, Canada, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993.

This software is not subject to and may not be made subject to any license of the American Telephone and Telegraph Company, Sun Microsystems Inc., Digital Equipment Inc., Lotus Development Inc., the Regents of the University of California, The X Consortium or MIT, or The Free Software Foundation.

This software is not subject to any export provision of the United States Department of Commerce, and may be exported to any country or planet.

Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it freely, subject to the following restrictions:

1.  The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it;

2.  The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation;

3.  Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation;

4.  This notice may not be removed or altered.

A few support files ( getopt(), strtok()) distributed with this package are in the public domain; they are so marked.

The files tar.h and is_tar.c were written by John Gilmore from his public-domain tar program, and are not covered by the above restrictions.

バグ
マジックディレクトリから マジックファイルを自動的に作成するよりよい方法があるはずです。 それは何なのでしょうか。より起動を速くするため マジックファイルをバイナリにコンパイルするとよいでしょう。 (たとえば ndbm(3) あるいは、異機種ネットワーク環境では固定長の ASCII 文字)。 そうすれば、同名の バージョン 7 のプログラムと同じぐらいの速さで System V バージョンの柔軟性を持ったプログラムとなるでしょう。

file には、正確さよりも 速度を重視したアルゴリズムが いくつかあるので ASCII ファイルの内容については 間違うことがあります。

ASCII ファイルのサポート ( 元々はプログラミング言語のため ) は 単純で、不十分であり、更新には再コンパイルが必要です。

複数の行に渡るものをサポートするため ``else'' 項があるべきです。

マジックファイルと キーワードの正規表現を サポートするべきです。 ASCII TAB をフィールドの識別子にすることは醜く、 ファイルの編集を難しくしていますが、残されています。

キーワードに大文字を許すことが勧められます。たとえば、 troff(1) コマンドと man page マクロの区別です。 正規表現のサポートで、このことは簡単になるでしょう。

FORTRAN に対してプログラムが働きません。 行の先頭にインデントされているキーワードを見ることにより FORTRAN だと判別すべきです。 正規表現のサポートによりこれは簡単になるでしょう。

ascmagic に入っている キーワードのリストは、おそらくマジックファイルに 入れるべきものです。 これはオフセットの値として `*' のようなキーワードを 使うことで可能でしょう。

最初の文字、最初の語、最初の long などに関する テストを 最初に読み込んだときに全て行うことができるよう マジックファイルを並べ直す最適化法はないだろうか。 マジックファイルの矛盾について述べるようにならないか。 エントリーの順序を マジックファイル上の位置ではなく、 ファイルオフセット順にすることはできないだろうか。

プログラムは、推定が「どれぐらいよい」のかを知る方法を 提供すべきです。ファイルの最初の 5 文字が ``From '' であるときに推測をしても、 ``Newsgroups:'' や "Return-Path:" といった文字による推測ほどよくはないので、推測結果を 捨てることになります。しかし、もしそういった文字が 現れなければ最初の推定を使わなければなりません。

このプログラムは、いくつかの商用の file コマンドより遅いです。

このマニュアルページ、特にこの節が長過ぎます。

入手性
オリジナル作者の最新のバージョンを anonymous FTP で、 ftp.deshaw.com の /pub/file/file-X.YY.tar.gz から手に入れることができます。