ファイルのサフィックスからではない場合、ファイルタイプはどのように知られていますか?


55

ファイル名にサフィックスが付いていない場合、ファイルの種類がどのように知られているか知りたいです。

たとえば、名前myfileが付けられたファイルは、最初はバイナリまたはテキストである可能性がありますが、システムはファイルがバイナリまたはテキストであるかどうかをどのように認識しますか


3
コメントだけで、残りの答えはすべてをカバーしています。最近では、ロケールの構成が間違っていたり、古い実行可能ファイルがあると、一部のutf-8ファイルが非ASCIIバイトのためにバイナリデータとして誤って検出される場合があります。
オリオン

19
システムは気にしません。特定のアプリケーションは重要ですが、それぞれ独自の方法でこれを処理します。
-jwodder

2
通常のファイル(デバイスファイル、UNIXドメインソケット、名前付きパイプなどではない)でも、「ファイルタイプ」は次の2つの異なることを意味します。(1)特定のファイル形式(「.docx」、XML、MS-DOSテキスト形式、RTF、固定長レコード、リストは非常に長くなる可能性があります)または(2)特定のアプリが処理方法を知っているファイル(「.xlsx」または「.doc」など、形式タイプと重複するもの) 。「ファイルの種類」について話すときは、その区別に留意する価値があります。
ブルースエディガー

@jwodderシステムは気にしません。これらのアプリケーションではなく、非実行可能ファイルを実行しようとしても実行できないと文句を言うのはシステムです!
ミスターリスター

1
@MrLister真ですが、実行可能/非実行可能は「拡張」とは関係ありません。
user2338816

回答:


84

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「データ」のみが出力されます。

したがって、接尾辞は必要ありません。間違って設定されている場合、サフィックスはとにかく混乱する可能性があります。


4
freedesktop.org共有MIMEデータベースもあり、これは基本的にすべてのX11アプリケーションで使用されます。これは概念的には同じですfile(1)が、実装が(非常に)異なります。
lcd047

4
このプロセスの結果は基本的に推測であり、重要なことに依存するべきではないことに注意してください。(ファイルを開くデフォルトのプログラムを決定するなどの便利な機能は問題あり
ません

したがって、テキストファイルの先頭に%PNGを追加すると、PNGファイルとして表示されます。右??
サガ

@sagaエンコードが正しく行われ、パーセント記号の代わりにパーミル記号を配置した場合:多分。追加のテストがあるかもしれません。
バナンイン

19

多くの場合、それは気にしません。それをプログラムに渡すだけで、解釈するかしないかのいずれかです。テキストエディタで.jpgを開くことは役に立たないかもしれませんが、これを行うことを妨げられません。拡張子は、ファイル名の残りの部分と同様に、人間の組織上の利便性のためです。

複数の方法で有効に解釈できるファイルを作成することもできます。ZIPファイル形式の先頭にはファイルの最後にヘッダーがあるため、他の項目を先頭に追加することができ、それでもZIPファイルとしてロードされます。これは一般的に、自己解凍のzipファイルを作成するために使用されます。


4
最後の段落について:Funky File Formatsは、そのテーマに関する興味深い話です。たとえば、java hello worldプログラムでもあるjpegを提示し、AESで暗号化するとPNGになり、3DESで復号化するとPDFなどになります(すべてが「興味深い」コンテンツ、つまりホワイトノイズやアーティファクトだけでなく)
ハーゲンフォンアイゼン

14

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

3
これはかなり誤解を招く恐れがあります。Unixファイルには、それ自体「ヘッダー」はありません。この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........IHDRpng画像)
-h3rrmiller

2
しかし、あなたの答えは、ヘッダーがUnixファイルに固有の機能であるように聞こえます。たとえば、テキストファイルにはそのようなヘッダーはありません。OPのような人は、おそらくCソースファイルとJavaソースファイルが異なる「ファイルタイプ」を持つと考えますが、それらを区別するヘッダーはありません。私は、「ファイルタイプ」はUnixでは意味のある概念でさえないと主張します。オペレーティングシステムはファイルシステムを提供するだけであり、特定のファイルの内容が何を意味するかを決定するのは各アプリケーション次第です。
ネイト・エルドリッジ

同意する。私は、ウサギの穴をあまり掘り下げることなく、できるだけ簡単に答えようとしていました。
h3rrmiller

7

最初に確認するのは、カーネルによって認識されるハードコードされたファイルタイプです。これらは、ディレクトリ、文字特殊ファイル、ブロック特殊ファイル、パイプ特殊ファイル、ソケット、シンボリックリンクなどのファイルタイプです。この情報は、ファイルのiノードから取得されます。ファイルがプレーンファイルの場合、次の情報セットはパターンを探すことで最初の256バイトから取得されます。したがって、これらのバイトを調べることで、テキストファイルとCソースコードが認識されます。さらに、ユーティリティは、ファイルタイプのテストと検証に使用されるマジックナンバーも探します。ファイルに情報を追加することにより、認識される独自のファイルタイプを追加できます/etc/magicmagic(5)マジックファイルの形式については、manページを参照してください。

古い実装(Solarisなど)では、ファイル/etc/magicは認識されるほとんどのファイルタイプを列挙していました。


4

このfileコマンドは、ファイル(の一部)を検査し、適切な推測を行うことから、いくつかのヒューリスティックを適用します。さらに、追加情報を取得できる特別なケースがいくつかあります。以下のような#!テキストファイルの先頭に、BOM(バイトオーダーマーク)、または実行可能ファイル形式の特定のヘッダバイト。#!実行可能ファイル内のおよびバイナリマークは、それらを区別するためにシステムによって使用されます。


4

システムは、ファイルがバイナリかテキストかを知りません。すべての(AFAIK)Unixタイプのオペレーティングシステムでfopen(path, "rb")は、まったく同じですfopen(path "r")-はb効果がありません。標準Cは、このような区別を行う他のOSに移植可能である必要があるため、受け入れられています。


0

私は、「ファイルタイプ」はUnixでは意味のある概念でさえないと主張します。

メインフレームのコンピューターの古き良き時代には、OSはシーケンシャルおよびインデックスシーケンシャルを含むいくつかのファイルタイプをサポートしていました。最新のオペレーティングシステム(Un * xおよびほぼ間違いなくWindows)は、ファイルタイプのセットを最小限に抑えます(実行可能ファイル、共有オブジェクトを含む)。

複数の方法で有効に解釈できるファイルを構築することも可能かもしれません

可能性はありますが、トリッキーなファイル形式があります。イメージ記述として解釈できるCコードです。さらに、テキストファイル、XMLファイル、SOAPドキュメントなど、より具体的ではないさまざまな形式があります。


1
ファイル形式が進むにつれて、XPMはそれほど難しくありません。「tricky」は、有効なJPEGファイルと有効なZIPファイルの両方から始まると考えています。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.