file — ファイルタイプを判別する
概要
file [-bcdEhiklLNnprsSvzZ0] [--apple] [--exclude-quiet] [--extension] [--mime-encoding]
[--mime-type] [-e testname] [-F separator] [-f namefile] [-m magicfiles] [-P name=value]
file ...
file -C [-m magicfiles]
file [--help]
説明
この man ページは、file コマンドのバージョン 5.46 をドキュメント化します。
file コマンドは、各引数をファイルタイプを分類しようとしてテストします。3 つのテストセットがあり、次の順序で実行されます。ファイルシステムテスト、マジックテスト、言語テスト。最初に成功したテストにより、ファイルタイプが出力されます。
出力されるタイプには、通常、次のいずれかの単語が含まれます。text(ファイルには印刷可能な文字といくつかの一般的な制御文字のみが含まれており、ASCII ターミナルで安全に読み込める可能性があります)、executable(ファイルには、UNIX カーネルまたは他のカーネルによって理解できる形式でコンパイルされたプログラムの結果が含まれています)、または data(これは他のすべてのものを意味します。data は通常、「バイナリ」または非印刷可能なファイルです)。例外は、バイナリデータを含むことがわかっているファイル形式(コアファイル、tar アーカイブ)です。マジックファイルを変更する場合、またはプログラム自体を変更する場合は、これらのキーワードを保持するようにしてください。ユーザーは、ディレクトリ内のすべての読み取り可能なファイルに「text」という単語が出力されることを期待しています。「shell commands text」を「shell script」に変更しないでください。
ファイルシステムテストは、stat(2) システムコールの戻り値を調べて行われます。プログラムは、ファイルが空であるか、何らかの特殊なファイルであるかどうかを確認します。システムヘッダーファイル <sys/stat.h> に定義されている場合、システムで実装されているソケット、シンボリックリンク、または名前付きパイプ(FIFO)などの既知のファイルタイプが推測されます。
マジックテストは、特定の固定形式のデータを持つファイルを確認するために使用されます。典型的な例は、<elf.h>、<a.out.h>、および標準のインクルードディレクトリにある <exec.h> に定義されているバイナリ実行可能ファイル(コンパイルされたプログラム)の a.out ファイルです。これらのファイルには、「マジックナンバー」がファイルの先頭近くに保存されており、UNIX オペレーティングシステムにファイルがバイナリ実行可能ファイルであり、そのタイプのいずれかであることを伝えます。この「マジックナンバー」の概念は、データファイルに拡張されています。ファイルに不変の識別子が固定のオフセットに配置されている場合、通常はそれを使用してファイルを記述できます。この情報を識別するファイルは、/etc/magic とコンパイルされたマジックファイル /usr/share/misc/magic.mgc、またはコンパイルされたファイルが存在しない場合は、ディレクトリ /usr/share/misc/magic にあります。さらに、$HOME/.magic.mgc または $HOME/.magic が存在する場合は、システムのマジックファイルよりも優先して使用されます。
--apple
file コマンドに、古い MacOS バージョンで使用されるファイルタイプとクリエーターコードを出力させます。コードは 8 文字で構成され、最初の文字はファイルタイプを表し、残りの文字はクリエーターを表します。このオプションは、apple スタイルの出力が定義されているファイル形式でのみ正常に機能します。
-b, --brief
出力行の先頭にファイル名を付加しません (簡潔モード)。
-C, --compile
マジックファイルまたはディレクトリの事前に解析されたバージョンを含む magic.mgc 出力ファイルを書き込みます。
-c, --checking-printout
解析されたマジックファイル形式の確認出力を行います。これは通常、-m オプションと組み合わせて、新しいマジックファイルをインストールする前にデバッグするために使用されます。
-d
内部デバッグ情報を stderr に出力します。
-E
ファイルシステムエラー (ファイルが見つからないなど) が発生した場合、POSIX が規定する通常の出力としてエラーを処理し、続行する代わりに、エラーメッセージを出力して終了します。
ファイルがマジックファイル内のエントリのいずれにも一致しない場合、テキストファイルであるかどうかを調べます。ASCII、ISO-8859-x、Macintosh および IBM PC システムで使用される非 ISO 8 ビット拡張 ASCII 文字セット、UTF-8 エンコードの Unicode、UTF-16 エンコードの Unicode、EBCDIC 文字セットは、それぞれで印刷可能なテキストを構成するバイトの異なる範囲とシーケンスによって区別できます。ファイルがこれらのテストのいずれかに合格した場合、その文字セットが出力されます。ASCII、ISO-8859-x、UTF-8、拡張 ASCII ファイルは、「テキスト」として識別されます。これらはほとんどすべてのターミナルでほぼ確実に読み取り可能になるためです。UTF-16 および EBCDIC は「文字データ」としてのみ識別されます。これらにはテキストが含まれていますが、読み取れるようにするには翻訳が必要です。
さらに、file はテキストファイルの種類に関する他の特徴を判断しようとします。ファイルの行が Unix 標準の LF ではなく、CR、CRLF、または NEL で終わる場合、これは出力されます。埋め込みエスケープシーケンスまたはオーバープリントを含むファイルも識別されます。
file は、テキストファイルで使用されている文字セットを判断すると、ファイルがどの言語で記述されているかを判断しようとします。言語テストでは、ファイルの最初のいくつかのブロックに表示される可能性のある特定の文字列 (<names.h>) を検索します。たとえば、キーワード .br はファイルが troff(1) 入力ファイルである可能性が最も高いことを示し、キーワード struct は C プログラムであることを示します。これらのテストは、前の 2 つのグループほど信頼性が高くないため、最後に実行されます。言語テストルーチンでは、いくつかの雑多なファイル ([tar]({filename}../../tar)(1) アーカイブ、JSON ファイルなど) もテストされます。
上記にリストされている文字セットのいずれかで記述されていると識別できないファイルは、単に「データ」と表示されます。
オプション
-e, --exclude testname
テスト名で指定されたテストを、ファイルタイプを決定するために使用されるテストのリストから除外します。有効なテスト名は次のとおりです。
apptype EMXアプリケーションタイプ(EMX上でのみ)。
ascii さまざまな種類のテキストファイル(このテストは、エンコーディングオプションの設定に関係なく、テキストのエンコーディングを推測しようとします)。
encoding ソフトウェアマジックテスト用のさまざまなテキストエンコーディング。
tokens 互換性のために無視されます。
cdf コンパウンドドキュメントファイルの詳細を出力します。
compress 圧縮ファイルを確認し、その中身を調べます。
csv カンマ区切り値ファイルを確認します。
elf ソフトウェアマジックテストが有効になっており、ELFマジックが見つかった場合に、ELFファイルの詳細を出力します。
json JSON(RFC-7159)ファイルを解析して、その準拠性を確認します。
soft マジックファイルを参照します。
simh SIMHテープファイルを調べます。
tar tarファイルの512バイトヘッダーのチェックサムを検証して、tarファイルを調べます。このテストを除外すると、ソフトウェアマジックメソッドを使用して、より詳細なコンテンツの説明を提供できます。
text 'ascii'の同義語。
--exclude-quiet
--excludeと同様ですが、ファイルが認識していないテストは無視します。これは、fileの古いバージョンとの互換性のために使用されます。
--extension
検出されたファイルタイプの有効な拡張子のスラッシュ区切りのリストを出力します。
-F, --separator separator
ファイル名とファイルの結果の間に使用する区切り文字を指定します。デフォルトは':'です。
-f, --files-from namefile
namefileから検査するファイル名を読み込みます(1行に1つ)。namefileまたは少なくとも1つのファイル名引数のいずれかを指定する必要があります。標準入力をテストするには、'-'をファイル名引数として使用します。namefileは展開され、含まれるファイル名がこのオプションが検出されたときに処理され、それ以降のオプション処理が行われる前に処理されます。これにより、同じファイル呼び出しで複数のファイルリストを異なるコマンドライン引数で処理できます。したがって、区切り文字を設定する場合は、ファイルリストを指定する前に設定する必要があります。例:「-F @ -f namefile」の代わりに、「-f namefile -F @」を使用します。
-h, --no-dereference
このオプションを指定すると、シンボリックリンクを追跡しません(シンボリックリンクをサポートするシステムの場合)。これは、環境変数POSIXLY_CORRECTが定義されていない場合のデフォルトです。
-i, --mime
fileコマンドが、より従来の人間が読める文字列ではなく、MIMEタイプ文字列を出力するようにします。したがって、「ASCII text」の代わりに、「text/plain; charset=us-ascii」と表示される場合があります。
--mime-type, --mime-encoding
-iと同様ですが、指定された要素のみを出力します。
-k, --keep-going
最初の一致で停止せず、処理を続行します。後続の一致には、「\012- 」が先頭に追加されます。(改行が必要な場合は、-rオプションを参照してください)。マジックパターンの中で、最も高い強度(-lオプションを参照)を持つものが最初に表示されます。
-l, --list
パターンとその強度を、マジック(5)強度によって降順にソートしたリストを表示します。これは、マッチングに使用されます(-kオプションも参照)。
-L, --dereference
このオプションは、ls(1) の同様の名前のオプションのように、シンボリックリンクをたどります(シンボリックリンクをサポートするシステムの場合)。環境変数 POSIXLY_CORRECT が定義されている場合、これがデフォルトになります。
-m, --magic-file magicfiles
代替のファイルとディレクトリのリストを指定します。これは単一の項目、またはコロンで区切られたリストにすることができます。ファイルまたはディレクトリの横にコンパイルされたマジックファイルがある場合、それが使用されます。
-N, --no-pad
ファイル名をパディングして、出力で整列させないようにします。
-n, --no-buffer
stdout を各ファイルのチェック後にフラッシュするように強制します。これは、ファイルリストをチェックする場合にのみ役立ちます。これは、ファイルタイプ出力をパイプから取得したいプログラムで使用することを目的としています。
-p, --preserve-date
utime(3) または utimes(2) をサポートするシステムでは、分析されたファイルのアクセス時間を保持し、ファイルが読み取られたかのように振る舞うようにします。
-P, --parameter name=value
さまざまなパラメータ制限を設定します。
名前 デフォルト 説明 bytes 1M ファイルから読み取る最大バイト数 elf_notes 256 処理する最大 ELF ノート数 elf_phnum 2K 処理する最大 ELF プログラムセクション数 elf_shnum 32K 処理する最大 ELF セクション数 elf_shsize 128MB 処理する最大 ELF セクションサイズ encoding 65K エンコーディングを決定するために使用する最大バイト数 indir 50 間接マジックの再帰制限 name 100 名前/使用マジックで使用する制限 regex 8K 正規表現検索の長さ制限
-r, --raw
印刷できない文字を \ooo に変換しません。通常、file は印刷できない文字を 8 進数表現に変換します。
-s, --special-files
通常、file は stat(2) が通常のファイルとして報告する引数ファイルのタイプのみを読み取って決定しようとします。これは、特殊ファイルを読み取ると奇妙な結果が生じる可能性があるためです。-s オプションを指定すると、file はブロックまたは文字特殊ファイルも読み取ります。これは、生のディスクパーティション内のデータのファイルシステムタイプを決定する場合に役立ちます。これはブロック特殊ファイルです。このオプションは、stat(2) によって報告されるファイルサイズを無視することも行います。一部のシステムでは、これは生のディスクパーティションに対してゼロサイズを報告します。
-S, --no-sandbox
libseccomp (https://github.com/seccomp/libseccomp) が利用可能なシステムでは、-S オプションはデフォルトで有効になっているサンドボックスを無効にします。このオプションは、file が外部の解凍プログラムを実行する場合、つまり、-z オプションが指定され、組み込みの解凍プログラムが利用できない場合に必要です。サンドボックスが利用できないシステムでは、このオプションは効果がありません。
注:このDebian版のファイルは、seccompサポートなしでビルドされているため、このオプションは効果がありません。
-v, --version
プログラムのバージョンを表示して終了します。
-z, --uncompress
圧縮されたファイルの内容を確認します。
-Z, --uncompress-noreport
圧縮されたファイルの内容を確認しますが、圧縮に関する情報は報告しません。
-0, --print0
ファイル名の最後にヌル文字「\0」を出力します。cut(1) コマンドの出力に使用すると便利です。 このオプションを複数回繰り返すと、各エントリについて、ファイル名、ヌル文字、説明(または「ERROR:」のテキスト)、そして2番目のヌル文字が出力されます。
--help ヘルプメッセージを表示して終了します。
環境変数
環境変数MAGICを使用して、デフォルトのマジックファイルの名前を設定できます。この変数が設定されている場合、fileは$HOME/.magicを開こうとしません。fileは、この変数の値に「.mgc」を適切に追加します。環境変数POSIXLY_CORRECTは、シンボリックリンクをサポートするシステムにおいて、fileがシンボリックリンクをたどるかどうかを制御します。設定されている場合、fileはシンボリックリンクをたどります。それ以外の場合は、たどしません。これは、-Lおよび-hオプションによっても制御されます。
ファイル
/usr/share/misc/magic.mgc デフォルトのコンパイルされたマジックリスト。
/usr/share/misc/magic デフォルトのマジックファイルを含むディレクトリ。
終了ステータス
fileは、操作が成功した場合に0で終了し、エラーが発生した場合は0より大きい値で終了します。 以下のエラーは診断メッセージを引き起こしますが、POSIXで要求されているように、-Eが指定されていない限り、プログラムの終了コードには影響しません。 ファイルが見つからない ファイルへの読み取り権限がない ファイルの種類を判別できない
例
$ file file.c file /dev/{wd0a,hda}
file.c: C program text
file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), stripped
/dev/wd0a: block special (0/0)
/dev/hda: block special (3/0)
$ file -s /dev/wd0{b,d}
/dev/wd0b: data
/dev/wd0d: x86 boot sector
$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
/dev/hda: x86 boot sector
/dev/hda1: Linux/i386 ext2 filesystem
/dev/hda2: x86 boot sector
/dev/hda3: x86 boot sector, extended partition table
/dev/hda4: Linux/i386 ext2 filesystem
/dev/hda5: Linux/i386 swap file
/dev/hda6: Linux/i386 swap file
/dev/hda7: Linux/i386 swap file
/dev/hda8: Linux/i386 swap file
/dev/hda9: empty
/dev/hda10: empty
$ file -i file.c file /dev/{wd0a,hda}
file.c: text/x-c
file: application/x-executable
/dev/hda: application/x-not-regular-file
/dev/wd0a: application/x-not-regular-file
関連項目
hexdump(1), od(1), strings(1), magic(5)
標準への準拠
このプログラムは、System V Interface Definition of FILE(CMD)を超えていると考えられています。ただし、その定義は曖昧な言語で記述されています。このプログラムの動作は、同じ名前のSystem Vプログラムとほとんど互換性があります。ただし、このバージョンはより多くのマジックを認識するため、多くのケースで異なる(ただしより正確な)出力を生成します。
このバージョンと System V の主な違いは、このバージョンでは空白を区切り文字として扱うため、パターン文字列内のスペースをエスケープする必要があることです。たとえば、
>10 string language impress (imPRESS data)
という既存の magic ファイルは、次のように変更する必要があります。
>10 string language\ impress (imPRESS data)
さらに、このバージョンでは、パターン文字列にバックスラッシュが含まれている場合、それをエスケープする必要があります。たとえば、
0 string \begindata Andrew Toolkit document
という既存の magic ファイルは、次のように変更する必要があります。
0 string \\begindata Andrew Toolkit document
Sun Microsystems の SunOS 3.2 以降には、System V バージョンをベースにした file コマンドが含まれており、いくつかの拡張機能が追加されています。このバージョンは Sun のバージョンとわずかな違いしかありません。このバージョンには、「&」演算子の拡張機能が含まれており、次のように使用されます。
>16 long&0x7fffffff >0 not stripped
セキュリティ
libseccomp が利用可能なシステムでは、file コマンドはプログラムの動作に必要なシステムコールのみに制限することで、セキュリティを強化します。ただし、file コマンドに -z オプションを使用して入力ファイルを解凍し、外部プログラムを実行する場合、このセキュリティ強化はメリットをもたらしません。外部の解凍プログラムを実行できるようにするには、-S オプションを使用してサンドボックスを無効にする必要があります。
マジックディレクトリ
magic ファイルのエントリは、主に USENET から収集され、さまざまな作者によって提供されています。Christos Zoulas (下記のアドレス) が、追加または修正された magic ファイルのエントリを収集します。magic ファイルのエントリの統合は、定期的に配布されます。
magic ファイルのエントリの順序は重要です。使用しているシステムによっては、エントリがまとめられている順序が正しくない場合があります。
沿革
file コマンドは、少なくとも Research Version 4 (マニュアルページの作成日は 1973 年 11 月) 以来、すべての UNIX に含まれていました。System V バージョンでは、magic タイプの外部リストという、1 つの重要な変更が導入されました。これにより、プログラムの速度はわずかに低下しましたが、柔軟性が大幅に向上しました。
このプログラムは、System V バージョンをベースにしており、Ian Darwin ⟨_\⟩ によって、他の誰のソースコードも参照せずに作成されました。
John Gilmore はコードを大幅に修正し、最初のバージョンよりも優れたものにしました。Geoff Collyer はいくつかの不備を発見し、magic ファイルのエントリを提供しました。Rob McMahon ⟨_\⟩ (1989 年) による「&」演算子の提供。
Guy Harris ⟨_\⟩ は、1993 年から現在まで、多くの変更を行いました。
1990 年から現在まで、Christos Zoulas ⟨_\⟩ が、主に開発とメンテナンスを行っています。
Chris Lowth ⟨_\⟩ (2000 年) は、-i オプションを処理し、代替の magic ファイルと内部ロジックを使用して、MIME タイプ文字列を出力するように変更しました。
エリック・フィッシャー ⟨_\⟩ 氏が 2000 年 7 月に修正し、文字コードを識別し、ASCII 以外のファイルの言語を識別するようにしました。
ルーベン・トーマス ⟨_\⟩ 氏が 2007 年から 2011 年にかけて修正し、MIME サポートを改善し、MIME と非 MIME のマジックを統合し、ディレクトリもファイルと同様にマジックとしてサポートし、多くのバグを修正し、マジックを更新および修正し、ビルドシステムを改善し、ドキュメントを改善し、Python バインディングを純粋な Python で書き直しました。
「magic」ディレクトリ(マジックファイル)への貢献者のリストは長すぎるため、ここに記載できません。ご協力いただいた皆様、ありがとうございます。多くの貢献者はソースファイルにリストされています。
法的通知
著作権 (c) イアン・F・ダーウィン、カナダ、トロント、1986-1999。標準的なバークレーソフトウェア配布の著作権に基づいており、ソース配布に含まれるファイル COPYING を参照してください。
ファイル tar.h と is_tar.c は、ジョン・ギルモア氏が tar(1) プログラムから提供したパブリックドメインのファイルであり、上記のライセンスの対象外です。
バグ
バグを報告し、パッチをバグトラッカー https://bugs.astron.com/ またはメーリングリスト ⟨_\⟩ (まず https://mailman.astron.com/mailman/listinfo/file にアクセスして登録してください) に送信してください。
TODO
MIME フラグと APPLE フラグのテストがいたるところに必要ないように、出力を修正し、実際の出力は 1 か所で行うようにします。これには設計が必要です。提案: 可能な出力をリストにプッシュし、最後にプッシュされた値 (より具体的であることが期待される) を最後に選択するか、リストが空の場合はデフォルト値を使用します。これにより、評価が遅くなることはありません。
MAGIC_CONTINUE の処理と、エントリ間に改行を挿入する処理は不格好で複雑であるため、リファクタリングして一元化します。
エンコーディングロジックの一部は encoding.c にハードコードされており、マジックファイルに !:charset アノテーションがあれば、移動できます。
マジックのバグをすべて修正し続けます。Debian BTS は優れた情報源です。
%s パターンなどの任意の長さの文字列を格納し、それを出力できるようにします。Debian バグ #271672 を修正します。これは、文字列を文字列プールに割り当て、文字列プールをマジックファイルの末尾に格納し、すべての文字列ポインタを文字列プールからの相対オフセットに変換することで実行できます。
現在のレベルからの相対オフセットの構文を追加します (Debian バグ #466037)。
file -ki が動作するようにします。つまり、複数の MIME タイプを出力します。
zip ライブラリを追加して、Office2007 ドキュメント内の情報を調べて、その内容に関する詳細を出力できるようにします。
ファイルの説明のソースの URL を出力するオプションを追加します。
スクリプト検索を組み合わせて、実行可能ファイル名を MIME タイプにマップする方法 (たとえば、!:mime のマジック値があり、その結果の文字列がテーブルで検索されるようにします) を追加します。これにより、各新しいハッシュバンインタープリターに対して同じマジックを繰り返し追加する必要がなくなります。
ファイル記述子が使用可能な場合は、バッファーをスキップして調整できるため、現在行っているぎこちないバッファー管理を行う必要はありません。
「name」および「use」について、コンパイル時に一貫性をチェックするように修正(「name」の重複、「use」が未定義の「name」を指している)。「name」/「use」をより効率的にするために、名前のソートされたリストを保持する。 パーサーで「^」を特殊ケースとして扱い、エンディアンを反転するようにし、その旨をドキュメントに記載する。これにより、「^」をエスケープする必要がなくなる。
ファイル内に指定されたオフセットが、バッファーサイズ(file.h 内の HOWMANY 変数)を超える場合、そのオフセットにシークするのではなく、処理を中断する。ファイルディスクリプタが利用可能になったときにバッファー管理を行うようにすると、ファイル内を自由にシークできるようになり、より良い方法となる。ただし、これには注意が必要であり、パフォーマンスとセキュリティの観点から、繰り返しシークを行うことで処理を遅くすることが可能になるためである。
現在、個別のバッファーを保持し、ファイルの末尾からのオフセットを使用する機能がサポートされているが、内部バッファー管理はまだ見直す必要がある。
入手方法
オリジナルの作者による最新バージョンは、ftp.astron.com の /pub/file/file-X.YZ.tar.gz ディレクトリで匿名 FTP を介して入手できます。