
任意のファイルに含まれるデータ型を識別する必要があります。私は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/pdf
がPDF document
。これは、常にマシンではない人が理解できる方法でファイル形式の上位レベルの説明です。
得ることができるさまざまな結果のほとんどは、この段階から来ます。magic
サポートされているタイプのリストとそのタイプの識別方法に関するファイルを表示できます。私のシステムは376種類をサポートしています。指定された名前とサポートされているタイプはシステムのパッケージングと構成によって決まります。libmagic
追加のハードコーディングされたテストも含まれています。
6:そのファイルはデータファイルとして認識する必要があります。
foo: data
これは、単にファイルに関する情報を特定できない場合です。
他の小さなラベルも表示されます。実行可能ファイル()ファイルには出力に ""が含まれ、通常は+x
カンマで区切られています。また、executable
実装file
では、「」などのファイル形式に関するその他の事項を説明できるように、特定のファイル形式に関する追加情報を知ることもできますPDF document, version 1.4
。
答え2
マニュアルページは一般的に紹介ではなく簡潔な参考資料です。 ~からウィキペディアページ。
file
ファイル名ではなくファイルの内容のみを表示します。 (また、ファイル形式(ディレクトリ、シンボリックリンク、名前付きパイプなど)などの一部のファイルメタデータも見ていますが、興味がある場合はコンテンツが重要です。)
file
ファイル形式は通常、最初の数バイトを見て、組み込みテーブルと比較して推測します。マジックナンバー。たとえば、ファイルがで始まる場合は、「PDF文書」%PDF
をfile
報告します(そしてより詳細に調査して最下位バージョンを報告します)。これには、最初の数バイトが印刷可能な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-type
MIMEタイプ自体のみが必要で、エンコード情報がない場合に使用してください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
(システムによっては調整が必要な場合があります。)これにより、システム上のファイル形式のリストが表示されます。このコマンドは、ルートファイルシステムのサイズに応じて実行するのに長い時間がかかることがあります。