タイトル: file ファイルの種類を表示
SEOタイトル: Linuxのfileコマンドの使い方|ファイルの種類・MIMEタイプを調べる
Linuxのfileコマンドは、指定したファイルの種類(ファイルタイプ)を判定して表示するコマンドです。テキストか画像か実行ファイルかといった中身の正体を、拡張子ではなくファイルの内部データから調べられます。
| この記事の要点 |
|---|
|
fileコマンドとは
file は、ファイルの種類を調べて表示するコマンドです。多くのLinuxディストリビューションに標準で用意されています。Windowsなどでは「.txt はテキスト、.jpg は画像」のように拡張子で種類を判断することが一般的ですが、Linuxでは拡張子に決まった意味を持たせない運用も多く、拡張子だけでは中身が分からない場面があります。
file コマンドは拡張子に頼らず、ファイルの中身を実際に読み取って種類を推定します。判定の主な手がかりになるのがマジックナンバーと呼ばれるデータです。多くのファイル形式は、先頭付近に「この形式である」ことを示す特徴的なバイト列を持っています。file はこの特徴を照合し、テキスト・画像・実行ファイル・圧縮ファイルなどを区別します。テキストファイルの場合は、含まれる文字コード(ASCIIやUTF-8など)も併せて表示されることがあります。
そのため、拡張子を変更したファイルや、拡張子が付いていないファイルでも、中身に基づいた判定結果を得られるのが特徴です。
基本的な使い方
もっとも基本的な使い方は、調べたいファイル名を引数に渡す形です。
|
$ file ファイル名 |
実行すると、「ファイル名: 種類」という形式で結果が表示されます。次の例では、ディレクトリやシンボリックリンクが判定されています。
|
$ file bin bin: directory
$ file initrd.img initrd.img: symbolic link to boot/initrd.img-4.18.0-17-generic |
このように、ディレクトリは directory、シンボリックリンクは symbolic link to ~ のように、ファイル以外の種類も判定されます。
主なオプション
用途に応じて、表示形式や判定方法を変えるオプションが用意されています。よく使われるものを示します。
| オプション | 意味 |
|---|---|
-i (または --mime) |
種類をMIMEタイプ(例: text/plain、image/png)の形式で表示する。文字コード情報が付くこともある。 |
-b (--brief) |
先頭のファイル名を省き、種類だけを簡潔に表示する。スクリプトで結果を扱うときに便利。 |
-z (--uncompress) |
圧縮ファイルを展開したと仮定し、中身(圧縮されているデータ)の種類も併せて判定する。 |
-L (--dereference) |
シンボリックリンク自体ではなく、リンク先のファイルの種類を判定する。 |
-f 一覧ファイル |
調べたいファイル名を1行ずつ書いたリストを読み込み、まとめて判定する。 |
--help |
利用できるオプションの一覧(ヘルプ)を表示する。 |
複数のファイルを一度に調べたい場合は、ファイル名を並べて指定したり、ワイルドカードを使ったりできます。
|
# 複数ファイルをまとめて判定 $ file memo.txt photo.png run.sh
# カレントディレクトリのすべてのファイルを判定 $ file * |
種類ごとの判定例
代表的なファイルを file で調べると、次のような結果が表示されます。実際の出力は環境やファイルの内容によって変わりますが、おおむね以下のような傾向になります。
|
# テキストファイル $ file memo.txt memo.txt: ASCII text
# PNG画像 $ file photo.png photo.png: PNG image data, 1280 x 720, 8-bit/color RGBA, non-interlaced
# 実行ファイル(ELFバイナリ) $ file /bin/ls /bin/ls: ELF 64-bit LSB pie executable, x86-64, ...
# MIMEタイプで表示 $ file -i photo.png photo.png: image/png; charset=binary |
画像や実行ファイルでは、画像の縦横サイズやビット深度、実行ファイルのアーキテクチャといった詳しい情報まで表示されることがあります。
拡張子に頼らないことの利点
ファイル名の拡張子は、利用者が自由に付け替えられます。たとえば中身が画像のファイルに .txt という拡張子が付いていても、ファイル名だけ見れば「テキスト」と誤解しかねません。
file は中身を読み取って判定するため、こうした拡張子と中身の食い違いを見抜くのに役立ちます。次の例では、拡張子が .txt でも、中身がPNG画像であれば画像として判定されます。
|
$ file picture.txt picture.txt: PNG image data, 1280 x 720, 8-bit/color RGBA, non-interlaced |
拡張子のないファイルや、ダウンロードしたばかりで正体が分からないファイルの確認、シェルスクリプトでファイルの種類によって処理を分けたい場面などで活用できます。
使うときの注意点
| 注意したいポイント |
|---|
|
シンボリックリンクのリンク先を判定する例を示します。
|
# リンク自体を表示 $ file link-to-log link-to-log: symbolic link to /var/log/syslog
# リンク先を判定 $ file -L link-to-log link-to-log: ASCII text |
よくある質問
Q. fileコマンドの判定結果はどのくらい正確ですか。
A. 多くの一般的な形式は、マジックナンバーをもとに高い精度で判定されます。ただし結果は推定であり、特徴的なパターンを持たないファイルや独自形式のファイルでは、data のように大まかな表示になったり、判定が一致しない場合もあります。重要な判断では、ほかの方法と併せて確認すると安心です。
Q. 拡張子を変えても種類を見抜けますか。
A. はい。file はファイル名ではなく中身を読み取って判定するため、拡張子を変更しても中身に応じた種類が表示されます。拡張子と実体の食い違いを確認する用途に向いています。
Q. 圧縮ファイルの中身の種類を知ることはできますか。
A. -z オプションを使うと、圧縮されている内側のデータについても種類の判定を試みます。圧縮形式そのものだけでなく、中に格納されたデータの種類を確認したいときに役立ちます。