ファイル名にサフィックスが付いていない場合、ファイルの種類がどのように知られているか知りたいです。
たとえば、名前myfile
が付けられたファイルは、最初はバイナリまたはテキストである可能性がありますが、システムはファイルがバイナリまたはテキストであるかどうかをどのように認識しますか
ファイル名にサフィックスが付いていない場合、ファイルの種類がどのように知られているか知りたいです。
たとえば、名前myfile
が付けられたファイルは、最初はバイナリまたはテキストである可能性がありますが、システムはファイルがバイナリまたはテキストであるかどうかをどのように認識しますか
回答:
file
ユーティリティは、3つの方法を超えるファイルタイプを決定します。
最初にファイルシステムのテスト:これらのテスト内で、statファミリシステムコールの1つがファイルに対して呼び出されます。これにより、通常のファイル、ディレクトリ、リンク、キャラクターデバイス、ブロックデバイス、名前付きパイプまたはソケットなど、さまざまなUNIXファイルタイプが返されます。それに応じて、魔法のテストが行われます。
魔法のテストはもう少し複雑です。ファイルタイプは、マジックファイルと呼ばれるパターンのデータベースによって推測されます。一部のファイルタイプは、ファイル内の特定の場所(たとえば、バイナリ)でビットまたは数値を読み取ることで判別できます。マジックファイルには「マジックナンバー」が含まれており、ファイルに含まれているかどうか、どのテキスト情報を印刷するかをテストします。これらの「マジックナンバー」は、1〜4バイトの値、文字列、日付、または正規表現です。さらにテストを行うと、追加情報が見つかります。実行可能ファイルの場合、追加情報は、動的にリンクされているかどうか、削除されているかどうかですかどうかまたはアーキテクチャ。場合によっては、ファイルの種類を正確に特定する前に複数のテストに合格する必要があります。しかし、とにかく、実行されるテストの数は問題ではなく、常に単なる推測にすぎません。
一般的なファイルタイプのファイルの最初の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)を見つけます。一部のスクリプト言語は、スクリプトの最初の行にあるハッシュバング(#!/bin/interpreter
)でも識別できます。
ファイルに何も当てはまらない場合は、ファイルの種類を判別できず、file
「データ」のみが出力されます。
したがって、接尾辞は必要ありません。間違って設定されている場合、サフィックスはとにかく混乱する可能性があります。
file(1)
が、実装が(非常に)異なります。
多くの場合、それは気にしません。それをプログラムに渡すだけで、解釈するかしないかのいずれかです。テキストエディタで.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
file
コマンドは、ファイルの内容から、ファイルの使用方法を推測しようとします。それは間違いありません。
file
。実際には、ファイルの分析を行います。ただし、ほとんどのファイルタイプは、種類のヘッダーによって識別されます。 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
ELF実行可能ファイルのヘッダー(/ bin / lsの最初の数バイト)。同様#!/bin/bash
に、ASCIIファイルの先頭で、それをシェルスクリプトとして識別します。別の例:(. 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
png画像)
最初に確認するのは、カーネルによって認識されるハードコードされたファイルタイプです。これらは、ディレクトリ、文字特殊ファイル、ブロック特殊ファイル、パイプ特殊ファイル、ソケット、シンボリックリンクなどのファイルタイプです。この情報は、ファイルのiノードから取得されます。ファイルがプレーンファイルの場合、次の情報セットはパターンを探すことで最初の256バイトから取得されます。したがって、これらのバイトを調べることで、テキストファイルとCソースコードが認識されます。さらに、ユーティリティは、ファイルタイプのテストと検証に使用されるマジックナンバーも探します。ファイルに情報を追加することにより、認識される独自のファイルタイプを追加できます/etc/magic
。magic(5)
マジックファイルの形式については、manページを参照してください。
古い実装(Solarisなど)では、ファイル/etc/magic
は認識されるほとんどのファイルタイプを列挙していました。
私は、「ファイルタイプ」はUnixでは意味のある概念でさえないと主張します。
メインフレームのコンピューターの古き良き時代には、OSはシーケンシャルおよびインデックスシーケンシャルを含むいくつかのファイルタイプをサポートしていました。最新のオペレーティングシステム(Un * xおよびほぼ間違いなくWindows)は、ファイルタイプのセットを最小限に抑えます(実行可能ファイル、共有オブジェクトを含む)。
複数の方法で有効に解釈できるファイルを構築することも可能かもしれません
可能性はありますが、トリッキーなファイル形式があります。イメージ記述として解釈できるCコードです。さらに、テキストファイル、XMLファイル、SOAPドキュメントなど、より具体的ではないさまざまな形式があります。