ファイル名にサフィックスがない場合、ファイルタイプがどのように認識されるかを知りたいのですが。
たとえば、myfile
という名前のファイルは、最初はバイナリまたはテキストである可能性がありますが、システムはファイルがバイナリであるかテキストであるかをどのようにして知るのですか?
file
ユーティリティは、3つの方法でファイルタイプを決定します。
まず、ファイルシステムテスト:これらのテスト内で、ファイルに対して stat ファミリーシステムコールの1つが呼び出されます。これは、さまざまな nixファイルタイプ を返します:通常のファイル、ディレクトリ、リンク、キャラクターデバイス、ブロックデバイス、名前付きパイプ、またはソケット。それに応じて、魔法のテストが行われます。
マジックテストは少し複雑です。ファイルタイプは、 マジックファイル と呼ばれるパターンのデータベースによって推測されます。一部のファイルタイプは、ファイル内の特定の場所(バイナリなど)のビットまたは数値を読み取ることで判別できます。マジックファイルには、「マジックナンバー」が含まれ、ファイルに含まれているかどうか、およびどのテキスト情報を印刷するかをテストします。これらの「マジックナンバー」は、1〜4バイトの値、文字列、日付、または正規表現です。さらにテストを行うと、追加情報が見つかります。実行可能ファイルの場合、追加情報は、それが 動的にリンクされた かどうか、 stripped かどうか、またはアーキテクチャです。ファイルの種類を正確に特定するには、複数のテストに合格する必要がある場合があります。しかし、とにかく、何回テストが実行されるかは関係ありません。それは常に良い推測です。
これらのマジックナンバーがどのように見えるかを理解するのに役立つ、いくつかの一般的なファイルタイプのファイルの最初の8バイトを次に示します。
Hexadecimal ASCII
PNG 89 50 4E 47|0D 0A 1A 0A ‰PNG|....
JPG FF D8 FF E1|1D 16 45 78 ÿØÿá|..Ex
JPG FF D8 FF E0|00 10 4A 46 ÿØÿà|..JF
Zip 50 4B 03 04|0A 00 00 00 PK..|....
PDF 25 50 44 46|2D 31 2E 35 %PDF|-1.5
マジックテストでファイルの種類が見つからない場合、ファイルはテキストファイルのように見え、file
はコンテンツのエンコーディングを探します。エンコーディングは、各セットの印刷可能なテキストを構成するさまざまな範囲と一連のバイトによって区別されます。
HEX値に応じて、改行も調査されます。
0A
(\n
)Un * x/Linux/BSD/OSX終了ファイルを分類します0D 0A
(\r\n
)はMicrosoftオペレーティングシステムのファイルです0D
(\r
)バージョン9まではMac OSです15
(\025
)はIBMのAIXです言語テストが始まります。それがテキストファイルのように見える場合、ファイルは特定の文字列を検索して、含まれている言語(C、Perl、Bash)を見つけます。 hashbang (#!/bin/interpreter
)スクリプトの最初の行。
ファイルに何も適用されない場合、ファイルタイプを判別できず、file
は「データ」を出力するだけです。
つまり、サフィックスは必要ありません。誤って設定すると、とにかくサフィックスが混乱する可能性があります。
多くの場合、気にしません。プログラムに渡すだけで、解釈するか解釈しないかのどちらかです。テキストエディタで.jpgを開くことは役に立たないかもしれませんが、これを行うことを妨げられていません。ファイル名の他の部分と同様に、拡張子は人間の組織的な便宜のためのものです。
複数の方法で有効に解釈できるファイルを作成することもできます。 Zipファイル形式の開始にはヘッダーファイルの最後にがあるため、他のものを先頭に追加しても、Zipファイルとしてロードされます。これは一般的に自己解凍Zipファイルを作成するために使用されます。
その情報は通常、ファイルのヘッダーにあります。 file
コマンドはターゲットを分析し、ファイルに関する情報を提供します。多くの情報は、多くの場合、ファイルの最初の数バイトであることが多いファイルヘッダーから生成されます(以下を参照)。ヘッダーは、ファイルの処理方法を理解するためにシステムによって使用されます。 #!/bin/bash
ファイルの先頭で、bashシェルを使用して次のスクリプトを解釈するようにシステムに指示します。 ELF
は、これがELF実行可能ファイルであることをシステムに通知します。
[~] root@www # file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[~] root@www # file /etc/passwd
/etc/passwd: ASCII text
ファイルヘッダーの例:
[root@server4 ~]# xxd old_sm_logo.png | head -5
0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
0000010: 0000 0134 0000 006f 0806 0000 0062 bf3c ...4...o.....b.<
[root@server4 ~]# xxd /bin/ls | head -5
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 3e00 0100 0000 a024 4000 0000 0000 ..>......$@.....
[root@server4 proj]# xxd resizer.sh | head -5
0000000: 2321 2f62 696e 2f62 6173 680a 5b20 2d7a #!/bin/bash.[ -z
0000010: 2022 2431 2220 5d20 2626 2065 6368 6f20 "$1" ] && echo
最初に確認することは、カーネルによって認識されるハードコードされたファイルタイプです。これらは、ディレクトリ、文字特殊ファイル、ブロック特殊ファイル、パイプ特殊ファイル、ソケット、シンボリックリンクなどのファイルタイプです。この情報は、ファイルのiノードから取得されます。ファイルがプレーンファイルの場合、次の一連の情報は、パターンを探すことによって最初の256バイトから取得されます。したがって、これらのバイトを調べることにより、テキストファイルとCソースコードが認識されます。さらに、ユーティリティは、ファイルタイプのテストと検証に使用されるマジックナンバーも探します。情報をファイル_/etc/magic
_に追加することで、認識される独自のファイルタイプを追加できます。マジックファイルの形式については、magic(5)
のマニュアルページを参照してください。
古い実装(Solarisなど)では、ファイル_/etc/magic
_は、認識されるほとんどのファイルタイプを列挙していました。
システムは、ファイルがバイナリであるかテキストであるかを知りません。すべての(AFAIK)Unixタイプのオペレーティングシステムでは、fopen(path, "rb")
はfopen(path "r")
とまったく同じです-b
は効果がありません。標準Cは、そのような区別を行う他のいくつかのOSに移植可能である必要があるため、受け入れられます。
file
コマンドは、ファイル(の一部)の検査と限定された推測からのヒューリスティックを適用します。さらに、追加情報を取得できるいくつかの特殊なケースがあります。以下のような #!
テキストファイル、BoM(バイトオーダーマーク)、または実行可能ファイル形式の特定のヘッダーバイトの先頭。 #!
と実行可能ファイルのバイナリマークは、システムで区別するために使用されます。
「ファイルの種類」は、Unixでは意味のある概念でさえないと主張します。
メインフレームコンピュータの古き良き時代に、OSはシーケンシャルおよびインデックスシーケンシャルを含むいくつかのファイルタイプをサポートしていました。最新のオペレーティングシステム(Un * x、そしておそらくWindows)では、ファイルタイプのセットを最小限に抑えています(実行可能ファイル、共有オブジェクトを含む)。
複数の方法で有効に解釈できるファイルを作成することも可能かもしれません
可能ですが、トリッキーなファイル形式があります。画像の説明として解釈できるCコードです。その上、テキストファイル、XMLファイル、SOAPドキュメントなど、さまざまな形式があります。