名前
magic - file コマンド用のマジックナンバーファイル
説明
このマニュアルページでは、
file(1)
コマンド (バージョン 4.12) が使用する magic ファイルの書式を説明する。
ファイルの種類を調べる方法は色々あるが、
file コマンドはファイルが特定の
「マジックナンバー (magic number)」
で始まるかどうかによってファイルの種類を識別する。
ファイル
/usr/share/file/magic で指定することは、調べるべきマジックナンバー、
特定のマジックナンバーが見つかった時に表示するメッセージ、
ファイルから取り出せるその他の情報である。
magic ファイルの各行では実行するテストを指定する。
テストでは、ファイル先頭から見て特定のオフセット位置にあるデータと、
1 バイトまたは 2 バイト、4 バイトの数値や文字列との比較が行われる。
テストが成功すると指定したメッセージが出力される。
行には以下の項目が含まれる:
offset
|
調べるデータのファイル内での位置を指定するオフセット値で、単位はバイトである。
|
type
|
調べるデータの型。指定できる値は以下の通りである:
byte
|
1 バイト値。
|
short
|
(ほとんどのシステムでは) 2 バイト値。マシンのネイティブのバイト順である。
|
long
|
(ほとんどのシステムでは) 4 バイト値。マシンのネイティブのバイト順である。
|
string
|
文字列を表すバイト列。
string 型の指定では、オプションとして /[Bbc]* を後ろに続けることができる。
B フラグは、対象ファイル中の複数個の空白を 1 個の空白に切り詰めて扱う。
この場合、対象ファイルは少なくとも 1 個の空白を含んでいる必要がある。
magic ファイルに
n 個の連続した空白がある場合、
対象ファイルには、これにマッチする
n 個の連続した空白が必要となる。
bフラグは、対象ファイル中の空白を
存在してもしなくてもよい空白として扱う。
さらに、c フラグは、大文字・小文字を区別しないマッチを行うことを指定する:
magic ファイル中の小文字は、
対象ファイル中の大文字・小文字の両方にマッチする。
しかし、magic ファイル中の大文字は、
対象ファイル中の大文字にのみマッチする。
|
date
|
UNIX 時刻と解釈される 4 バイト値。
|
ldate
|
UNIX 形式の時刻と解釈される 4 バイト値。
ただし UTC ではなくローカルタイムとして解釈される。
|
beshort
|
(ほとんどのシステムでは) 2 バイト値。バイト順はビッグエンディアンである。
|
belong
|
(ほとんどのシステムでは) 4 バイト値。バイト順はビッグエンディアンである。
|
bedate
|
(ほとんどのシステムでは) 4 バイト値。バイト順はビッグエンディアンである。
UNIX 時刻と解釈される。
|
leshort
|
(ほとんどのシステムでは) 2 バイト値。バイト順はリトルエンディアンである。
|
lelong
|
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。
|
ledate
|
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。
UNIX 時刻と解釈される。
|
leldate
|
(ほとんどのシステムでは) 4 バイト値。バイト順はリトルエンディアンである。
UNIX 形式の時刻と解釈される。
ただし UTC ではなくローカルタイムとして解釈される。
|
|
数値型の値の後には
& と数値を書くことができる。この場合、比較を行う前に
& の後に置いた数値との AND 演算が行われる。型の前に
u を置くことで、順序付きの比較を符号無しで行うことが指定できる。
test
|
ファイル内の値と比較する値。
これは C 言語の文字列として指定し、エスケープ文字も普通に使える
(例: \n は改行文字)。
|
|
数値
の前には、実行する動作を指定する文字を置くことができる。
= を指定した場合は、ファイル内の値は指定した値と等しくなければならない。
< を指定した場合は、ファイル内の値は指定した値より小さくなければならない。
> を指定した場合は、ファイル内の値は指定した値より大きくなければならない。
& を指定した場合は、指定した値で立っている全てのビットがファイル内の値でも
立っていなければならない。
^ を指定した場合は、指定した値で立っているどのビットも、
ファイル内の値で立っていてはならない。
x はどんな値にもマッチする。文字が省略されている場合は、
= が指定されているとみなされる。
|
|
数値は C 言語の書式で指定する。例えば、
13 は 10 進数、
013 は 8 進数、
0x13 は 16 進数である。
|
|
文字列の場合、ファイル中に含まれるバイト文字列は、指定された
バイト文字列にマッチしなければならない。
演算子
=, <, > は文字列にも適用できる (ただし
& は適用できない)。
マッチングを行う長さは、magic ファイルの文字列引数の長さである。
つまり、
>\0 を指定することにより、ある行をどんな文字列にもマッチさせ、そして多分
その文字列を表示させることができるだろう。
|
message
|
比較が成功したときに出力されるメッセージ。
文字列に
printf(3)
の書式指定が含まれている場合、このメッセージを書式指定文字列として使って
ファイル内の値 (指定された全てのマスク処理は実行される) が出力される。
|
一部のファイルフォーマットでは、ファイルの種類とともに追加情報が表示される。
文字
> で始まる行は、追加で行うテストと表示メッセージを示す。
1 行に含まれる
> の数はテストのレベルを表す。
先頭に
> がない行はレベル 0 になる。
レベル
n+1 の各行は、magic ファイル中で自分より前にあるレベル
n の行のうち、最も近い位置のものの制御に従う。
レベル
n の行のテストが成功すると、それに続く全てのレベル
n+1 の行で指定されているテストが実行され、
そのテストが成功するとメッセージが出力される。
次に
n があった場所でこの動作は終了する。
直前の
> の直後の文字が
( ならば、括弧の後の文字列は間接オフセット値と解釈される。
つまり、括弧の後の数字はファイル内でのオフセットとして使われる。
このオフセット位置にある値が読み込まれ、
読み込まれた値がファイル中でのオフセットとして使われる。
間接オフセット値の書式は以下である:
((x[.[bslBSL]][+-][y]). x の値はファイル内でのオフセット値として使われる。
そのオフセット位置にある byte 型、short 型、long 型の値が読み込まれるが、
どの型になるかは型指定子
[bslBSL] によって決まる。
大文字で示される型はビッグエンディアンの値と解釈され、
小文字で示される型はリトルエンディアンの値と解釈される。
この数まで
y の値に加えられ、その結果がファイル中のオフセット値として使われる。
何も指定されていない場合のデフォルトの型は long である。
前のフィールドの長さによってオフセット値が変わるため、
正確なオフセット値がわからない場合もある。
この場合は、直前の上位レベルの
フィールドの終わりからの相対位置でオフセットを指定できる
(当然ながらこの方法はサブレベルのテスト、つまり
> で始まるテストでしか使えない)。
このような相対オフセット値は、オフセット値の前に
& を置くことで指定する。
バグ
long, belong, lelong, short, beshort, leshort, date, bedate, ledate の書式はシステム依存である。識別させるファイルは、
この長さが違うシステムから持ってくることが多いため、
バイト列として指定すべきだろう (2B, 4B 等)。
(現時点では) 間接オフセット値でエンディアンを指定して
データを扱うことはできない。
関連項目
file(1)
- このファイルを読むコマンド。