ファイルサフィックスを使わずにファイル形式をどのように知ることができますか?

ファイルサフィックスを使わずにファイル形式をどのように知ることができますか?

ファイル名にサフィックスがない場合は、ファイルの種類を知る方法を知りたいです。

たとえば、名前付きファイルはmyfileバイナリまたはテキストで始めることができます。システムは、ファイルがバイナリかテキストかどうかをどのように知ることができますか?

答え1

これfileユーティリティは、次の3つの方法でファイルの種類を決定します。

まずファイルシステムのテスト:これらのテストの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コンテンツのエンコードが見つかります。エンコーディングは、各グループで印刷可能なテキストを構成するさまざまな範囲とバイトシーケンスによって区別されます。

改行文字も16進値に基づいて研究されています。

  • 0A( \n) Un*x/Linux/BSD/OSX 終了ファイル分類
  • 0D 0A\r\n)はMicrosoftオペレーティングシステムのファイルです。
  • 0D\r)はバージョン9より前のMacオペレーティングシステム用です。
  • 15\025)はIBMのAIXです。

言語テストスタート。テキストファイルの場合は、ファイルに特定の文字列が含まれているかどうかを検索して、そのファイルに含まれる言語(C、Perl、Bash)を見つけます。一部のスクリプト言語は、次のように使用することもできます。ハッシュボーン#!/bin/interpreter)スクリプトの最初の行にあります。

ファイルに適用される内容がない場合、ファイル形式を確認できず、file「データ」のみが印刷されます。

したがって、サフィックスは必要ありません。誤って設定すると、サフィックスが混乱を招く可能性があります。

答え2

多くの場合は関係ありません。プログラムに渡すと、プログラムは解釈も解釈もしません。テキストエディタで.jpgを開くとうまくいかないかもしれませんが、開くことはできます。ファイル名の残りの部分と同様に、拡張子は組織の便宜のためです。

さまざまな方法で効果的に解釈できる文書を整理することも可能です。 ZIPファイル形式はヘッダーで始まるためファイルの終わりに、前に他のコンテンツを追加することができ、まだ ZIP ファイルとして読み込まれます。これは通常、自動解凍zipファイルを作成するために使用されます。

答え3

この情報は通常ファイルヘッダーにあります。この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

答え4

このfileコマンドはファイル(一部)を調べ、検証された推測を行い、いくつかの経験的な方法を適用します。これに加えて、#!テキストファイルの先頭の特定のヘッダーバイト、BoM(バイト順表示)、または実行可能ファイル形式など、いくつかの特殊な場合に追加情報を取得できます。#!システムは実行可能ファイルとバイナリタグを使用してそれらを区別します。

関連情報