"file" コマンド man ドキュメントに指定された「コンパイルされたマジックファイル」の用途は何ですか?

"file" コマンド man ドキュメントに指定された「コンパイルされたマジックファイル」の用途は何ですか?

Linuxファイルコマンドのマニュアルを読んでください。魔法テストの説明で以下を見つけました。

Any file with some invariant identifier at a small fixed offset into the file
can usually be described in this way. The information identifying these files
is read from /etc/magic and the compiled magic file /usr/share/misc/magic.mgc,
or the files in the directory /usr/share/misc/magic if the compiled file
does not exist. In addition, if $HOME/.magic.mgc or $HOME/.magic exists,
it will be used in preference to the system magic files.

マジックファイルが「MagicNumber ->ファイルの種類」関係のコレクションであると想像できます。 「ファイル」プログラムが実行され、ファイル形式を見つけてファイルヘッダーを取得します。しかし、なぜそうなのか理解できません。

  • なぜこのファイルをコンパイルするのですか?
  • コマンドで使用する魔法のコンパイルファイルを作成する方法はありますか?
  • これらのテストとファイルに関連するコマンドオプションの使い方は何ですか?前任者: -C or -m

答え1

  • なぜこのファイルをコンパイルするのですか?

私はこれがパフォーマンス上の理由だと思います。マジックデータベースは小さくない。ファイルは、人間が読めるそれぞれの魔法のようなソースファイルを解析し、ファイル形式を検出するための構造を構築し、各パターンの強度を計算し、それに応じてすべてをソートする必要があります。このプロセスは特に数十年前に非常に遅くなる可能性があります(ファイルは1970年代から使用されました)。

私はファイルが実行時にデータベースを構築し、結果をキャッシュすることができると思いますが、ユースケースを考慮すると完全に不要で複雑に見え、他の多くの問題を引き起こします。

  • コマンドで使用する魔法のコンパイルファイルを作成する方法はありますか?
file -m MAGIC_SOURCE -C

これにより、現在の作業ディレクトリと同じ基本名MAGIC_SOURCEと拡張子を持つコンパイル済みのマジックファイルが作成されます。.mgc

ファイルまたはディレクトリで使用できます。ディレクトリに末尾のスラッシュを使用しないでください。

たとえば、file -m ~/.magic -Cすべての~/.magic/*ソースコードを.magic.mgcコンパイル済みファイルにコンパイルします。

  • これらのテストとファイルに関連するコマンドオプションの使い方は何ですか?例:-Cまたは-m

-C一部のソースファイルをコンパイルするようにファイルに指示します。

-m使用するマジックファイル(ソースまたはコンパイル)をファイルに通知します。たとえば-C、ソースファイルを含むすべてのファイルを使用してファイルタイプを検出するなどの操作を実行できます。

man fileman magicこのコマンドとマジックソースファイルの構文の詳細については、参考資料を参照してください。

関連情報