FILE(1)

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

書式
file [-bciknNsvzL] [-f namefile] [-F separator] [-m magicfiles] file ... file -C [-m magicfile]

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

ファイルの種類として表示されるのは、 “text” (印字可能文字と少数の制御文字だけのファイルで、 ASCII 端末に表示した場合、 問題が起こらないもの)、 “executable” ( UNIX カーネル等に理解可能な形にコンパイルされたプログラムを 含むファイル)、その他のものを意味する “data” (data は、通常 ‘バイナリ’ か表示不能なもの) のうちの 1 つです。 例外は、内部フォーマットがよく知られた、 バイナリデータを含むファイル (コアファイルや tar アーカイブ) です。 ファイル /usr/share/misc/magic やプログラムそのものを変更するときは、 これらのキーワードを残して下さい 。 ディレクトリ内のすべての可読なファイルは、 単語 “text” を表示することが期待されています。 Berkeley で行われたように、 “shell commands text” を “shell script” と変更するようなことはしないで下さい。 ファイル /usr/share/misc/magic は、 file のソース配布中の Magdir サブディレクトリ中の大量の小さなファイルから機械的に構築されることに 注意してください。

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

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

ファイルがマジックファイルのどのエントリにもマッチしない場合、 text ファイルに見えるかどうか検査されます。 ASCII, ISO-8859-x, 非 ISO 8-bit 拡張 ASCII 文字集合 (Macintosh および IBM PC システムで使用), UTF-8-encoded Unicode, UTF-16-encoded Unicode, EBCDIC の文字集合が区別可能であり、 これには各文字集合における印字可能 text を構成する バイトの範囲およびシーケンスを使用します。 ファイルがこれらのテストのいずれかを通過した場合、文字集合が報告されます。 ASCII, ISO-8859-x, UTF-8, extended-ASCII ファイルは “text” として識別されます。 なぜなら、ほとんどどのような端末においても読めるからです。 UTF-16 および EBCDIC は “character data” でしかありません。 これらは text を含みますが、読む前に変換が必要だからです。 さらに、 file は text タイプファイルの他の特性も判定しようとします。 ファイルの行の終端が、 UNIX 標準の LF ではなく、 CR, CRLF, NEL のいずれかである場合、そのことが報告されます。 組み込みのエスケープシーケンスや重ね打ちを含むファイルについても、 識別されます。

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

上記の文字集合のいずれで記述されているとも識別できなかったファイルは、 単に “data” と呼ばれます。

オプション

-b  出力行の前にファイル名を付けません (短縮モード)。

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

-C  magic.mgc 出力ファイルを書きます。 これには構文解析される前のバージョンのファイルが含まれます。

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

-F separator
    ‘’: の代りに、指定したセパレータ文字を使用します。

-i  file に、伝統的な人間が読める形式の代りに、 mime タイプ文字列を出力させます。 よって、 “ASCII text” の代りに “text/plain; charset=us-ascii” となります。 本オプションが動作するようにするために、 file はファイル認識方法 (例えば、多くの text ファイルタイプやディレクトリ等) を変え、 別の magic ファイルを使用します (後述の 関連ファイル 節を参照してください)。

-k  最初にマッチしても停止せずに、処理を継続します。

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

-n  各ファイルのチェック後に、標準出力をフラッシュします。 ファイルの一覧をチェックしているときのみ、有用です。 ファイルタイプをパイプから出力するプログラムにおいて使用することを意図します。

-N  ファイル名が格好良く揃うようにはパッドしません。

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

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

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

-s  通常、 file が引数のファイルの読み込みとタイプの判定を行うのは、 stat(2) が通常ファイルであると報告した場合のみです。 これにより問題を回避しています。 なぜなら、特殊ファイルの読み込みは、 特定の結果を発生させる場合があるからです。 -s オプションを指定すると、 file は、ブロックおよびキャラクタの特殊ファイルも読み込みます。 これは、raw ディスクパーティション中のデータに存在する ファイルシステムタイプの判定に有用です。 なぜなら、raw ディスクパーティションはブロック型特殊ファイルであるからです。 本オプションはまた、 file が stat(2) が報告するファイルの大きさを無視するようにさせます。 なぜなら、システムによっては、 raw ディスクパーティションの大きさは 0 であると報告するものがあるからです。

関連ファイル
/usr/share/misc/magic.mgc
    デフォルトの組み込まれたマジックナンバのリスト
/usr/share/misc/magic
    デフォルトのマジックナンバのリスト
/usr/share/misc/magic.mime
    -i が指定されて mime タイプを出力する場合に使用する、 デフォルトのマジックナンバのリスト

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

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

標準適合性
FILE(CMD) の svid4 の曖昧な記述から 判断する限りにおいては、 このプログラムはこの仕様を越えていると思われます。 同名の 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 file.c file /dev/{wd0a,hda}
    file.c:    C program text
    file:      ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
               dynamically linked (uses shared libs), stripped
    /dev/wd0a: block special (0/0)
    /dev/hda:  block special (3/0)
    $ file -s /dev/wd0{b,d}
    /dev/wd0b: data
    /dev/wd0d: x86 boot sector
    $ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}	# Linux
    /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
    $ file -s /dev/rwd0e				# BSD
    /dev/rwd0e:
    Unix Fast File system (little-endian),
    last mounted on /usr,
    last written at Mon Feb 10 13:22:40 2003,
    clean flag 2,
    number of blocks 28754208,
    number of data blocks 27812712,
    number of cylinder groups 3566,
    block size 8192,
    fragment size 1024,
    minimum percentage of free blocks 5,
    rotational delay 0ms,
    disk rotational speed 60rps,
    TIME optimization
    $ file -i file.c file /dev/{wd0a,hda}
    file.c:    text/x-c
    file:      application/x-executable, dynamically linked (uses shared libs),
               not stripped
    /dev/hda:  application/x-not-regular-file
    /dev/wd0a: application/x-not-regular-file

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

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

John Gilmore は、コードを拡張し、最初の版よりもよいものにしました。 Geoff Collyer は、不適当なところが数箇所あるのを発見し、 いくつかマジックファイルエントリを提供しました。 Rob McMahon <cudcv@warwick.ac.uk> は、1989 年に、 ‘&’ 演算子を寄贈しました。

Guy Harris <guy@netapp.com> は、1993 年から現在に至り、多くの変更を行っています。

基本開発と 1990 年から現在に至るメンテナンスを、 Christos Zoulas <christos@astron.com> が行っています。

2000 年に Chris Lowth <chris@lowth.com> が修正を行い、 -i オプションが mime タイプ文字列を出力し、 別のマジックファイルと内部ロジックを使用するようになりました。

2000 年 7 月に Eric Fischer <enf@pobox.com> が修正を行い、 文字コードを識別し、非 ASCII ファイルの原語を識別しようとするようになりました。

Magdir ディレクトリ ( /usr/share/misc/magic ファイルのソース) に対する寄贈者は、ここに含めるには長過ぎます。 ご了承ください。

法律上の注意
Copyright (c) Ian F. Darwin, Toronto, Canada, 1986-1999. Covered by the standard Berkeley Software Distribution copyright; see the file LEGAL.NOTICE in the source distribution.

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 license.

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

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

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

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

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

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

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

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

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

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

このプログラムは、いくつかの商用の file コマンドより遅いです。 複数の文字コードのサポートにより、より遅くなっています。

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

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