MAGIC(5)

名称
magic - file コマンドのマジック番号ファイル

解説
このマニュアルページでは file(1) コマンド バージョン 3.22 で使用されるマジックファイルのフォーマットに ついて説明します。 file コマンドは、他のテストと共に、ファイルがある マジック番号 で始まっているかどうかをテストして、ファイルのタイプを識別します。 ファイル /usr/share/misc/magic では、どのマジック番号をテストするか、 あるマジック番号が見つかったときにどのようなメッセージを出力するか、 また、そのファイルから抽出するべき追加情報について指定しています。

このファイルの各行ではテストすべき項目について指定しています。 テストは、ファイル中のある特定のオフセットで始まるデータを 1 バイト、2 バイトもしくは 4 バイトの数値あるいは文字列と 比較して行います。 もしテストが成功するとメッセージが出力されます。 各行は以下のフィールドから構成されます。

offset
    テストするファイルのデータのオフセットをバイト数で指定する数字です。

type
    テストするデータの型です。指定できる値は

    byte
        1 バイトの値。

    short
        (ほとんどのシステムにおいて) 2 バイトの値。 そのマシンの固有のバイト順で指定します。

    long
        (ほとんどのシステムにおいて) 4 バイトの値。 そのマシンの固有のバイト順で指定します。

    string
        バイトの文字列。

    date
        UNIX 日時として解釈される 4 バイトの値。

    beshort
        (ほとんどのシステムにおいて) 2 バイトの値。 ビッグエンディアンのバイト順です。 (ほとんどのシステムにおいて) 4 バイトの値。 ビッグエンディアンのバイト順です。 UNIX 日時として解釈される (ほとんどのシステムにおいて) 4 バイトの値。 ビッグエンディアンのバイト順です。 (ほとんどのシステムにおいて) 2 バイトの値。 リトルエンディアンのバイト順です。 (ほとんどのシステムにおいて) 4 バイトの値。 リトルエンディアンのバイト順です。 UNIX 日時として解釈される (ほとんどのシステムにおいて) 4 バイトの値。 リトルエンディアンのバイト順です。

数字の型にはオプションとして & と数値を続けることができ、 これにより比較を行う前に AND をとる数値を指定します。 型の前に u を付加すると比較は符号なしで行なわれます。

test
    ファイル中の値と比較される値。 型が数字の場合、この値は C 言語の形式で指定されます。 これが文字列の場合、 通常のエスケープ記法 (たとえば改行では\n) が可能な C 言語文字列として 指定されます。

    数値の前には実行される操作を示す文字を付加することができます。 その文字には ファイルの値が指定された値と等価であることを指定する = 、ファイルの値が指定された値より小さいことを指定する < 、ファイルの値が指定された値より大きいことを指定する > 、指定された値の中でセットされているすべてのビットが ファイルでの値ですべてセットされていることを指定する & 、指定された値の中でセットされているどれかのビットが ファイルでの値でオフであることを指定する ^ 、何らかの値がマッチすることを指定する x があります。 これらの文字がない場合は = が指定されているものとみなされます。

    数値は C 言語の形式で指定されます。例えば 13 は 10 進数、 013 は 8 進数、 0x13 は 16 進数となります。

    文字列値については、 ファイル中のバイト文字列は指定されたバイト文字列に マッチしなければなりません。 オペレータ = と < と > ( & を除く) が文字列に適用できます。 マッチングに使用される長さは マジックファイルでの文字列の引数の長さとなります。 これは >\0 とすることにより、 その行はどの文字列にもマッチすることが可能であり、 おそらくその文字列が出力されることを意味します (すべての文字列はヌル文字列より長いため)。

message
    比較が成立したときに出力されるメッセージです。 文字列に printf(3) 指定形式が含まれている場合は、ファイルから得た値 (指定されたマスクを 適用したもの) が、そのメッセージをフォーマット文字列として用いて出力さ れます。

いくつかのファイルフォーマットは、ファイルタイプと共に出力される追加情報 を含んでいます。文字 > で始まる行は追加テストと出力されるメッセージを指定します。 その行での > の数はテストのレベルを指定します。行頭に > がない行はレベル 0 とみなされます。 レベル n+1 の各行はマジックファイル中でその行より前にあるもっとも近いレベル n の行の制御下にあります。レベル n での行のテストが成功した場合、それに続く行で指定されたすべてのレベル n+1 のテストが実施され、 それらのテストが成功するとメッセージが出力されます。 次のレベル n の行でこれが終了します。 最後の > に続く最初の文字が ( であれば、その括弧の後の文字列は間接オフセットとして解釈されます。 これは括弧の後の数字がそのファイル中のオフセットとして使用されることを 意味します。そのオフセットでの値が読み込まれ、再度ファイルのオフセット として使用されます。間接オフセットは (x[.[bsl]][+-][y]) の形式をとります。値 x はファイル中でのオフセットとして使われます。 型指定子 [bsl] によりそれぞれバイト、short もしくは long として読み込まれます。 その数字に値 y が加算され、その結果はファイルの中でのオフセットとして使用されます。型 指定子がない場合は long がデフォルトの型となります。

オフセットは、その前にあるフィールドの長さに依存するため、 正確な値が分からない場合があります。 そのような場合は最後の上位レベルのフィールドの最後からの 相対的なオフセットを指定することができます。 (もちろんこれは下位レベルのテスト、すなわち > で始まるテストでのみ可能です。) この場合の相対オフセットは & をオフセットのプレフィックスとして使用して指定します。

バグ
フォーマット long, belong, lelong, short, beshort, leshort, date, bedate, ledate はシステムに依存します。 テストされるファイルは通常それらの長さが不変であるシステムのものであり、 これらはおそらくバイト数 (2B とか 4B とか) として指定すべきででょう。

間接オフセットで使用されるエンディアンを指定したデータは (現在は) サポートされていません。

関連項目
file(1)