ファイルを分類するLinuxファイルコマンド

ファイルを分類するLinuxファイルコマンド

任意のファイルに含まれるデータ型を識別する必要があります。私は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フォルダには、現在利用可能なファイル形式(fileコマンドの後にファイルを入力したときに得られる出力)を提供するデータベースがあります。そうですか? 「file」コマンドの出力に「text」という単語が含まれるたびに、これは実際にはテキストビューアを使用して読み取ることができる項目を参照しますが、「text」を持たない項目は一種のバイナリファイルですか?

答え1

file 複数のテストを使用:

1: もし文書存在しない、読み取れない、またはファイルの状態を確認できない場合、出力はファイルが処理されたがそのタイプを確認できないことを示す必要があります。

それからcannot open file: No such file or directory

2:ファイルが通常のファイルではない場合は、そのファイルタイプを識別する必要があります。ファイルタイプディレクトリ、FIFO、ソケット、特殊ブロック、および特殊文字はこのように識別する必要があります。他の実装定義ファイルタイプも認識されます。ファイルがシンボリックリンクの場合、リンクはデフォルトで検証され、ファイルはシンボリックリンクによって参照されるファイル形式をテストする必要があります。 (以下-h-iオプションを参照してください。)

.: directoryすると、とのような内容が出力されます/dev/sda: block special。これと以前のポイントのほとんどの形式は次のとおりです。POSIXによって部分的に定義されている- 出力の特定の文字列を使用できます。

3:ファイル長が0の場合は空のファイルとして認識されます。

これはfoo: empty

4:ファイルユーティリティはファイルの初期セグメントをチェックし、位置区分テストに基づいてその内容を推測識別する必要があります。 (正解は保証されていません。下記の-d、-M、および-mオプションを参照してください。)

5:ファイルユーティリティはファイルをスキャンし、状況に応じた基本的なシステムテストに基づいてその内容を推測識別する必要があります。 (回答が正確であるという保証はありません。)

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

コマンドfileにはこれらの数値とその種類を含むデータベースがあり、通常、データベースは/usr/share/mime/magicファイルの内容を次の場所にマップします。MIMEタイプ。そこの出力(通常はfile -i基本的にこれが得られない部分)は次のとおりです。定義されたメディアタイプまたは拡張。 「状況に合ったテスト」は同じアプローチを使用しますが、もう少しあいまいです。これらのどれも正確であることを保証することはできませんが、良い推測のためのものです。

fileまた、これらのタイプを名前にマップするデータベースがあり、それによって認識されるファイルapplication/pdfPDF document。これは、常にマシンではない人が理解できる方法でファイル形式の上位レベルの説明です。

得ることができるさまざまな結果のほとんどは、この段階から来ます。magicサポートされているタイプのリストとそのタイプの識別方法に関するファイルを表示できます。私のシステムは376種類をサポートしています。指定された名前とサポートされているタイプはシステムのパッケージングと構成によって決まります。libmagic追加のハードコーディングされたテストも含まれています。

6:そのファイルはデータファイルとして認識する必要があります。

foo: dataこれは、単にファイルに関する情報を特定できない場合です。

他の小さなラベルも表示されます。実行可能ファイル()ファイルには出力に ""が含まれ、通常は+xカンマで区切られています。また、executable実装fileでは、「」などのファイル形式に関するその他の事項を説明できるように、特定のファイル形式に関する追加情報を知ることもできますPDF document, version 1.4

答え2

マニュアルページは一般的に紹介ではなく簡潔な参考資料です。 ~からウィキペディアページ

fileファイル名ではなくファイルの内容のみを表示します。 (また、ファイル形式(ディレクトリ、シンボリックリンク、名前付きパイプなど)などの一部のファイルメタデータも見ていますが、興味がある場合はコンテンツが重要です。)

fileファイル形式は通常、最初の数バイトを見て、組み込みテーブルと比較して推測します。マジックナンバー。たとえば、ファイルがで始まる場合は、「PDF文書」%PDFfile報告します(そしてより詳細に調査して最下位バージョンを報告します)。これには、最初の数バイトが印刷可能なASCIIの範囲内にある場合に「ASCIIテキスト」を報告するなど、マジック番号で始まらないファイル形式の経験的な方法が含まれています。

の出力はfile脆弱です。 UNIXのバリエーションとバージョンによって異なる場合があります。 Linux、Cygwin、および* BSDでは、このコマンドは次の形式で予測可能な出力を生成するfileオプションをサポートしています。-iジェスチャー広大極 メディアタイプ(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-typeMIMEタイプ自体のみが必要で、エンコード情報がない場合に使用してくださいapplication/pdf。たとえば、-bファイル名を行の先頭に表示したくない場合は、このオプションを渡します。

答え3

私はあなたが答えを読むことを願っていますここ。答えのいくつかの抜粋は次のとおりです。

コマンドのマニュアルページでfile

fileこのコマンドは、実際にファイル形式を決定するために3つのテストを実行します。

最初のテスト

ファイルシステムテストは、stat(2) システムコールの戻り結果チェックに基づいています。

2回目のテスト

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

3回目のテスト

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

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

それでは、C ++プログラムがこのように始まり、3回目のテストが成功したとしましょう。

#include <iostream>
bla
bla

3番目のテストでは、キーワードは#includeそのタイプを具体的に指定します。プログラムがありますが、消費者保護計画プログラムを持っています。今確認してみると、

$ 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 ++プログラムは同じと見なされます)。

答え4

GilesとMichael Homerは素晴らしい答えを提供しました。参考にしてください。システムで認識されるファイル形式を表示するには、次の手順を実行します。

cat /usr/share/magic

これにより権限の問題が発生したり存在しない場合は、おそらく

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

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

関連情報