名前
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 等)。
(現時点では)
間接オフセット値でエンディアンを指定して
データを扱うことはできない。