Linuxファイルコマンド分類ファイル


17

ランダムファイルに含まれるデータの種類を認識する必要があります。私はLinuxが初めてです。

このfileコマンドを使用して、ファイルに含まれるデータの種類を理解する予定です。私はそのコマンドを試して、以下の出力を得ました。

誰かが、fileコマンドがファイルの最初のバイトを調べてデータ型を判断することを提案しました。このfileコマンドは、ファイル拡張子をまったく調べません。あれは正しいですか?私はマニュアルページを見ましたが、技術的すぎると感じました。fileコマンドがどのように機能するかについて、はるかに簡単な説明が記載されたリンクを誰かが提供していただければ幸いです。

fileコマンドを実行した後に得られる可能性のあるさまざまな答えは何ですか?たとえば、以下のトランスクリプトでは、JPEG、ISOメディア、ASCIIなどを取得します。

画面出力は次のとおりです

 m7% file date-file.csv
date-file.csv: ASCII text, with CRLF line terminators
m7% file image-file.JPG
image-file.JPG: JPEG image data, EXIF standard
m7% file music-file.m4a
music-file.m4a: ISO Media, MPEG v4 system, iTunes AAC-LC
m7% file numbers-file.txt
numbers-file.txt: ASCII text
m7% file pdf-file.pdf
pdf-file.pdf: PDF document, version 1.4
m7% file text-file.txt
text-file.txt: ASCII text
m7% file video-file.MOV
video-file.MOV: data


アップデート1

回答をありがとう、彼らは私のためにいくつかのことを明確にしました。

したがって、フォルダ/ usr / share / mime / magicに現在のファイル形式(ファイルコマンドを入力してファイルを追跡するときに取得できる出力)を提供するデータベースが正しく理解されている場合。あれは正しいですか?「ファイル」コマンドの出力に「テキスト」という単語が含まれている場合は常に、テキストビューアーで読むことができるものを指し、「テキスト」のないものは何らかのバイナリであるというのは本当ですか?


6
将来的には、端末出力の写真を投稿することは実際にはお勧めできません(または誰もが楽しんでいます)。マークダウンコードブロックの書式設定を使用します。
HalosGhost 14

3
写真を削除し、コードを投稿しました。
user2543622 14

注:ファイルがファイルを識別できない場合、多くの場合TrIDが識別できます。ファイル特性の独自のデータベースがあり、それを使用するコミュニティーによって作成されます。
ジョセフは、モニカを復活

回答:


13

file いくつかの種類のテストを使用します

1:ファイルが存在しない場合、読み取ることができない場合、またはファイルの状態を判別できない場合、出力はファイルが処理されたがそのタイプを判別できなかったことを示すものとする。

これはのように出力されますcannot open file: No such file or directory

2:ファイルが通常のファイルでない場合、そのファイルの種類が識別されます。ファイルタイプディレクトリ、FIFO、ソケット、ブロックスペシャル、およびキャラクタスペシャルはそのように識別されなければならない。他の実装定義のファイルタイプも識別できます。ファイルがシンボリックリンクの場合、デフォルトではリンクが解決され、シンボリックリンクによって参照されるファイルのタイプがテストされます。(以下の-hおよび-iオプションを参照してください。)

これは次のように出力されます.: directory/dev/sda: block special。この点と以前の点の形式の多くは、POSIXによって部分的に定義されています-出力にある特定の文字列に依存できます。

3:ファイルの長さがゼロの場合、空のファイルとして識別されます。

これがありますfoo: empty

4:ファイルユーティリティは、ファイルの初期セグメントを検査し、位置依存テストに基づいてその内容を特定する際に推測を行わなければなりません。(答えは正しいことが保証されていません。以下の-d、-M、および-mオプションを参照してください。)

5:ファイルユーティリティは、ファイルを検査し、状況依存のデフォルトシステムテストに基づいてその内容を識別することを推測します。(答えは正しいとは限りません。)

これら2つはマジックナンバー IDを使用し、コマンドの最も興味深い部分です。マジックナンバーは識別の種類、そのファイル内の既知の場所にありますバイトの特別なシーケンスです。伝統的にその場所は最初の2バイトですが、この用語はさらに長い文字列やその他の場所を含むように拡張されました。コマンドのマジックナンバーの詳細については、この他の質問を参照してくださいfile

fileコマンドは、これらの数字と彼らがに対応したタイプのデータベースを持っています。そのデータベースは通常にあり/usr/share/mime/magic、ファイルの内容をMIMEタイプにマップします。ここでの出力(file -iデフォルトで取得しない場合の多くの部分)は、定義済みのメディアタイプまたは拡張子になります。「状況依存テスト」は同じ種類のアプローチを使用しますが、少し曖昧です。これらのどれも正しいとは限りませんが、良い推測をすることを目的としています。

fileまた、これらのタイプを名前にマッピングするデータベースがあります。これにより、識別されたファイルがとしてapplication/pdf記述できることを認識しますPDF document。これらの人間が読める名前は、別の言語にもローカライズされる場合があります。これらは常に、マシンではなく、人が理解できる方法でのファイルタイプの高レベルの説明です。

取得できるさまざまな出力の大部分は、これらの段階からのものです。magicファイルを見て、サポートされているタイプのリストとそれらの識別方法を確認できます-私のシステムは376の異なるタイプを知っています。指定された名前とサポートされているタイプは、システムのパッケージングと構成によって決定されるため、システムは、私のシステムよりも多いか少ないかをサポートしますが、一般的には多くあります。libmagicまた、追加のハードコードされたテストも含まれます。

6:ファイルはデータファイルとして識別されます。

これはfoo: data、ファイルについてまったく理解できなかった場合です。

表示できる他の小さなタグもあります。実行可能(+x)ファイルexecutableの出力には、通常コンマ区切りで" " が含まれます。file実装は、あなたの「のように、それらについての追加ポイントを記述できるようにするには、いくつかのファイル形式について、余分なものを知っているかもしれませんPDF document, version 1.4」。


8

通常、マニュアルページは紹介ではなく簡潔なリファレンスです。ウィキペディアのページから始めてください

fileファイル名ではなく、ファイルの内容のみを調べます。(また、ファイルタイプなどのファイルメタデータも参照します。ディレクトリ、シンボリックリンク、名前付きパイプなど。ただし、関心のある場合は、重要なコンテンツです。)

file通常、最初の数バイトを見て、それらを組み込みのマジックナンバーのテーブルと比較することにより、ファイルの形式を推測します。ファイルが始まる場合たとえば、%PDFし、file「PDFドキュメント」を報告します(最小バージョンを報告するために、さらに掘り行きます)。マジックナンバーで始まらないファイルタイプの場合、ヒューリスティックが含まれます。たとえば、最初の数バイトがすべて印刷可能なASCII範囲にある場合、「ASCIIテキスト」を報告します。

の出力fileは脆弱です。unixバリアントからunixバリアント、およびバージョンによって異なる場合があります。Linux、Cygwin、および* BSDでは、fileコマンドは-i予測可能な出力をMIME メディアタイプの形式で生成するオプションをサポートします(IANA は標準メディアタイプのリストを管理します)。詳細はそれほど多くなく、出力は人間にやさしいものではありませんが、出力は予測可能でコンピューターに優しいです。

$ file -i somefile.csv
somefile.csv: text/plain; charset=us-ascii
$ file -i somefile.jpg
somefile.jpg: image/jpeg; charset=binary
$ file -i somefile.pdf
somefile.pdf: application/pdf; charset=binary

file --mime-typeエンコード情報なしでMIMEタイプ自体のみが必要な場合などに使用しますapplication/pdf-b行の先頭にファイル名を表示したくない場合は、オプションを渡します。


5

ここから答えを読んでください。答えからの抜粋のいくつかは、

fileコマンドのマニュアルページから、

file コマンドは、実際にファイルタイプを判別するために3つのテストを実行します。

最初のテスト

ファイルシステムのテストは、stat(2)システムコールからの戻り値を調べることに基づいています。

二次試験

マジックナンバーテストは、特定の固定形式のデータを持つファイルをチェックするために使用されます。

第三テスト

言語テストは、ファイルの最初の数ブロックのどこにでも現れる特定の文字列(names.hを参照)を探します。たとえば、キーワード.brは、キーワードstructがCプログラムを示すように、ファイルがtroff(1)入力ファイルである可能性が高いことを示します。

fileコマンドの出力は通常、成功したテストの結果に基づいています。

ここで、C ++プログラムがこのように起動し、3番目のテストが成功すると仮定すると、

#include <iostream.h>
bla
bla

第三の試験ごとにキーワードは、#include特にそれが型であることを指定しますCの我々は持っているもののプログラムCPPの手でプログラムを。さて、チェックすると

$ file example.cpp

example.cpp: ASCII C program text

現在、オブジェクト指向の概念はC ++に固有のものです。C ++固有のファイルを作成しましょう。

C ++プログラムを次のように起動します。

Class something
{
}
bla
bla

今、私が発行するとき

$ file example.cpp

出力は、

example.cpp: ASCII C++ program text

これは基本的に、fileコマンドが同様のファイルでどのように機能するかを説明します(この例では、C ++固有のオブジェクト指向機能を使用しない限り、CプログラミングとC ++プログラムは同様に扱われます)。


1

ジルとマイケル・ホーマーが優れた答えを提供してくれました。ご紹介します。システムで認識されているファイルの種類を確認するには、実行してみてください

cat /usr/share/magic

許可に問題がある場合、または存在しない場合は、

find / -exec file {} \; 2>/dev/null | cut -d":" -f2 | sort -u

(システムによっては微調整が必​​要な場合があります)これにより、システム上のファイルタイプのリストが表示されます。ルートファイルシステムのサイズによっては、このコマンドの実行に時間がかかる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.