ファイルの種類として表示されるのは、 ``text '' (印字可能文字と少数の制御文字だけのファイルで、 ASCII 端末に表示した場合、 問題が起こらないもの)、 ``executable '' ( UNIX カーネル等に理解可能な形にコンパイルされたプログラムを 含むファイル)、その他のものを意味する ``data '' (data は、通常 `バイナリ' か表示不能なもの) のうちの 1 つです。 例外は、内部フォーマットがよく知られた、 バイナリデータを含むファイル (コアファイルや tar アーカイブ) です。 ファイル /usr/share/misc/magic やプログラムそのものを変更するときは、 これらのキーワードを残して下さい 。 ディレクトリ内のすべての可読なファイルは、 単語 ``text '' を表示することが期待されています。 Berkeley で行われたように、 ``shell commands text '' を ``shell script '' と変更するようなことはしないで下さい。 ファイル /usr/share/misc/magic は、 のソース配布中の Magdir サブディレクトリ中の大量の小さなファイルから機械的に構築されることに 注意してください。
ファイルシステムテストは、 stat(2) システムコールからの戻り値を調べることに基づいています。 このプログラムは、ファイルが空であるかどうか、ある種の 特殊ファイルであるかどうかを調べます。 使っているシステムに合った既知のファイルの種類 (システムに実装されたソケット、シンボリックリンク、 名前付きパイプ (FIFO)) は、システムヘッダファイル In sys/stat.h で定義されていれば表示されます。
マジックナンバテストは、ファイルが固定フォーマットのデータであるか どうかをチェックするために使われます。 よい例が、実行可能なバイナリ実行形式 (コンパイルされたプログラム) a.out ファイルです。このフォーマットは標準インクルードディレクトリ内の In a.out.h や場合により In 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 を含みますが、読む前に変換が必要だからです。 さらに、 は text タイプファイルの他の特性も判定しようとします。 ファイルの行の終端が、 UNIX 標準の LF ではなく、 CR, CRLF, NEL のいずれかである場合、そのことが報告されます。 組み込みのエスケープシーケンスや重ね打ちを含むファイルについても、 識別されます。
text タイプファイルで使用されている文字集合を判定した後、 その言語を推定しようとします。 言語テストは、ファイルの始めの数ブロックに 特定の文字列 ( Inames.h を参照) があるかどうかを探します。たとえばキーワード .br があればそれはおそらく troff(1) の入力ファイルであり、 struct というキーワードは、C 言語のプログラムであることを示しています。 こうした推定方法は、前述の 2 つのテストより信頼性が低いため、 最後に行われます。言語テストルーチンは ( tar(1) アーカイブのような) その他のファイルもチェックします。
上記の文字集合のいずれで記述されているとも識別できなかったファイルは、 単に ``data '' と呼ばれます。
このバージョンと 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"
マジックファイルにおけるエントリの順序は 重要です。 使っているシステムによって、エントリの順序が正しくなくなることが あります。 もし、あなたの古い コマンドがマジックファイルを使っているのなら、 比較のため古いマジックファイルを保存して下さい (たとえば、 /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
このプログラムは、System V バージョンを基づいており、 An Ian Darwin Aq ian@darwinsys.com によって、他の誰かのソースコードを見ることなく 書かれました。
An John Gilmore は、コードを拡張し、最初の版よりもよいものにしました。 An Geoff Collyer は、不適当なところが数箇所あるのを発見し、 いくつかマジックファイルエントリを提供しました。 An Rob McMahon Aq cudcv@warwick.ac.uk は、1989 年に、 `& ' 演算子を寄贈しました。
An Guy Harris Aq guy@netapp.com は、1993 年から現在に至り、多くの変更を行っています。
基本開発と 1990 年から現在に至るメンテナンスを、 An Christos Zoulas Aq christos@astron.com が行っています。
2000 年に An Chris Lowth Aq chris@lowth.com が修正を行い、 -i オプションが mime タイプ文字列を出力し、 別のマジックファイルと内部ロジックを使用するようになりました。
2000 年 7 月に An Eric Fischer Aq enf@pobox.com が修正を行い、 文字コードを識別し、非 ASCII ファイルの言語を識別しようとするようになりました。
Magdir ディレクトリ ( /usr/share/misc/magic ファイルのソース) に対する寄贈者は、ここに含めるには長過ぎます。 ご了承ください。
The files tar.h and is_tar.c were written by An John Gilmore from his public-domain tar program, and are not covered by the above license.
ユーティリティには、正確さよりも 速度を重視したアルゴリズムが いくつかあるので text ファイルの内容については 間違うことがあります。
text ファイルのサポート (元々はプログラミング言語のため) は 単純で、不十分であり、更新には再コンパイルが必要です。
複数の行に渡るものをサポートするため else 項があるべきです。
マジックファイルと キーワードの正規表現を サポートするべきです。 ASCII TAB をフィールドの識別子にすることは醜く、 ファイルの編集を難しくしていますが、残されています。
キーワードに大文字を許すことが勧められます。たとえば、 troff(1) コマンドと man page マクロの区別です。 正規表現のサポートで、このことは簡単になるでしょう。
FORTRAN に対してプログラムが働きません。 行の先頭にインデントされているキーワードを見ることにより FORTRAN だと判別すべきです。 正規表現のサポートによりこれは簡単になるでしょう。
ascmagic に入っている キーワードのリストは、おそらく Magic ファイルに 入れるべきものです。 これはオフセットの値として `* ' のようなキーワードを 使うことで可能でしょう。
最初の文字、最初の語、最初の long などに関する テストを 最初に読み込んだときに全て行うことができるよう マジックファイルを並べ直す最適化法はないだろうか。 マジックファイルの矛盾について述べるようにならないか。 エントリの順序を マジックファイル上の位置ではなく、 ファイルオフセット順にすることはできないだろうか。
プログラムは、推定が ``どれぐらいよい'' のかを知る方法を 提供すべきです。ファイルの最初の 5 文字が ``From '' であるときに推測をしても、 ``Newsgroups: '' や ``Return-Path: '' といった文字による推測ほどよくはないので、推測結果を 捨てることになります。しかし、もしそういった文字が 現れなければ最初の推定を使わなければなりません。
このプログラムは、いくつかの商用の コマンドより遅いです。 複数の文字コードのサポートにより、より遅くなっています。