ファイルタイプを判定する
namefile
]
[
-F
separator
]
[
-m
magicfiles
]
file
...
file
-C
[
-m
magicfile ]
/usr/share/file/magic
ファイルや file プログラム自身を変更する場合も、
これらのキーワードは変更しないこと。
人々は、ディレクトリ内の読み取り可能なファイルに対しては、
全て ``text'' が表示されると思っている。
Berkeley がかつてやったように、
``shell commands text'' を ``shell script'' に変更したりしてはいけない。
ファイル
/usr/share/file/magic
は、このプログラムのソースディストリビューションのサブディレクトリ
Magdir
にある数多くの小さなファイルから機械的に作られている点に注意すること。
ファイルシステムのテストは、
stat (2)
システムコールの結果の検討に基づいて行われる。
このプログラムは、ファイルが空であるかや、
特殊ファイルであるかをチェックする。
実行中のシステムに特有の既存のファイルタイプ
(ソケット・シンボリックリンク・名前付きパイプ (FIFO)
(ただしシステムで実装されている場合)) は、
システムのヘッダファイル
<sys/stat.h>
に定義されていれば、すぐに分かる。
マジックナンバーテストは、
特定の決まった形式のデータを含むファイルをチェックするのに使われる。
もっとも簡単な例は、バイナリ実行可能ファイル (コンパイルされたプログラム)
a.out
である。
この形式は標準インクルードディレクトリの
a.out.h
で定義されている
( exec.h
の場合もある)。
これらのファイルにはファイルの先頭付近の特定位置に
「マジックナンバー」が格納されている。
これにより \s-1UNIX\s0 オペレーティングシステムは、
ファイルがバイナリ実行可能であることが分かり、
そのうちのどのファイルタイプであるかも分かる。
「マジックナンバー」の考え方は、データファイルに対する拡張にも応用されている。
ファイルの先頭から近い場所に一定の識別子を持つファイルは、
通常はこの方法で記述できる。
これらのファイルについての情報識別子は、コンパイルされたマジックファイル
/usr/share/file/magic.mgc
から読み込まれる。
このコンパイルされたファイルがない場合は、
/usr/share/file/magic
から読み込まれる。
更に
file
は
$HOME/.magic.mgc
または
$HOME/.magic
からマジックファイルのエントリを探す。
ファイルがマジックファイルのどのエントリともマッチしなかった場合、
テキストファイルであるかを調べる。
文字集合内の表示可能なテキストを構成する
バイト列の範囲の違いを調べることにより、
ASCII, ISO-8859-x, (Macintosh や IBM PC システムで使用されている)
ISO に準拠しない 8 ビット拡張 ASCII 文字集合、
UTF-8 エンコードされたユニコード、UTF-16 エンコードされたユニコード、
EBCDIC 文字集合を識別する。
ファイルがこれらのテストをパスすると、文字集合名が表示される。
ASCII, ISO-8859-x, UTF-8, 拡張 ASCII のファイルは、
これはほぼ全ての端末で読むことができるので、
``text'' として識別される。
UTF-16 と EBCDIC のファイルは、
たとえテキストを含んでいたとしても読む前に変換が必要なので、
単なる ``character data'' とされる。
さらに
file
はテキスト型ファイルの他の特徴も決定しようとする。
ファイルの行が Unix で標準的な LF ではなく、
CR, CRLF, NEL で終了している場合は、その旨を表示する。
ファイルに組み込み (embedded) エスケープシーケンスや
重ね打ち (overstriking) が含まれている場合も、その旨を表示する。
file
はテキスト型ファイルで使われている文字集合を決定した後は、
ファイルが書かれている言語を決定しようとする。
言語テストではファイルの最初の数ブロックのどこかに現れる特定の文字列
( names.h
を参照) を探す。
例えばキーワード
があれば、そのファイルは多くの場合
troff (1)
の入力ファイルであることを示しており、
キーワード
struct
は C 言語プログラムであることを示している。
これらのテストは前のテストに比べると信頼性が低いので、
最後に実行される。
言語テストのルーチンは他のファイルタイプ (例えば
tar (1)
アーカイブ) に関するテストも行う。
上に挙げた文字集合のどれにも当てはまらないファイルは、
単に ``data'' と表示される。
-b, --brief
-c, --checking-printout
-C, --compile
-f, --files-from namefile
namefile
ファイルから読み込む
(1 行に 1 つのファイル名)。
namefile
または少なくとも 1 つのファイル名引き数がなければいけない。
標準入力をテストする場合は、ファイル名引き数として ``-'' を使うこと。
-F, --separator separator
-i, --mime
-k, --keep-going
-L, --dereference
-m, --magic-file list
-n, --no-buffer
-N, --no-pad
-p, --preserve-date
-r, --raw
-s, --special-files
-v, --version
-z, --uncompress
--help
/usr/share/file/magic.mgc
/usr/share/file/magic
/usr/share/file/magic.mime.mgc
/usr/share/file/magic.mime
/etc/magic
$ 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} /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 -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
tar.h
と
is_tar.c
は John Gilmore によって書かれたもので、
彼のパブリックドメイン
tar
プログラムに由来する。
この 2 つのファイルには上記のライセンスが適用されない。
ascmagic
にあるキーワードは、多分 Magic ファイルに入れるべきだろう。
これはオフセット値に `*' のようなキーワードを使うことで可能だろう。
その他の最適化としてはマジックファイルのソートがある。
これにより一度読み込んでしまえば、
最初のバイト・最初のワード・最初の long 型、... というように
全てのテストで突き止めていくことができる。
マジックファイルエントリの衝突について苦情を言ってください。
マジックファイルのエントリのソートは、
マジックファイルにおける位置ではなくファイルオフセットで行う、
というルールにするべきだろうか ?
推定した結果が「どのくらい良いか」を評価する手段を、
プログラムが提供すべきである。
最終的には (例えば ``Newsgroups:'' に対する ``Return-Path:'' のように)
他の推定結果より良くない推定結果
(例えば、ファイルの最初の 5 文字が ``From '' など) は削除する。
しかし他の推定結果が出なければ、
最初の推定結果を使えるようにしておくべきである。
このプログラムは、いくつかのベンダの file コマンドより遅い。
複数文字コードを新しくサポートしたことで、いっそう遅くなってしまった。
この man ページ、特にこのセクションが長すぎる。
/pub/file/file-X.YZ.tar.gz
から入手できる。