はじめに

こんにちは!今回はfileコマンドについて学んでいきましょう。

fileは、ファイルの種類を自動判定してくれるコマンドです。「このファイル、何なんだろう?」って時に超便利。ファイル名の拡張子に騙されずに、ファイルの実際の内容を判定してくれます。

fileコマンドとは

fileコマンドは、指定したファイルの種類を判定し、その情報を表示する外部コマンドです。ファイルの内容を調べて、テキストファイルなのか、画像なのか、実行ファイルなのかなどを自動判別します。

ファイルの拡張子に関係なく、実際のファイル形式を判定するので、拡張子が間違っているファイルでも正しく認識できます。これめっちゃ便利!

基本構文

1
file [オプション] ファイル

複数のファイルを同時に指定することもできます。

主なオプション

オプション 説明
-b ファイル名を表示しない
-i MIMEタイプで表示
-L シンボリックリンク先を判定
-z 圧縮ファイル内も判定
-s スパースファイルも表示

使用例

例1: 基本的な使い方(テキストファイル)

1
file test.txt

実行結果:

1
test.txt: ASCII text

テキストファイルとして認識されました。

例2: 画像ファイルの判定

1
file image.png

実行結果:

1
image.png: PNG image data, 800 x 600, 8-bit colormap, non-interlaced

PNG画像ファイルとして認識され、詳細な情報も表示されます。

例3: 実行ファイルの判定

1
file /bin/ls

実行結果:

1
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked

実行ファイルとして認識されました。

例4: 複数ファイルを同時に判定

1
file test.txt image.png script.sh

実行結果:

1
2
3
test.txt: ASCII text
image.png: PNG image data, 800 x 600, 8-bit colormap, non-interlaced
script.sh: POSIX shell script text executable, ASCII text

複数のファイルを指定すると、全てが判定されます。

例5: ファイル名を表示しない(-bオプション)

1
file -b test.txt

実行結果:

1
ASCII text

ファイル名が表示されず、種類だけが出力されます。

例6: MIMEタイプで表示(-iオプション)

1
file -i image.png test.txt

実行結果:

1
2
image.png: image/png; charset=binary
test.txt: text/plain; charset=us-ascii

MIMEタイプ形式で表示されます。Webアプリケーションで便利!

例7: シンボリックリンク先を判定(-Lオプション)

1
file -L symbolic_link.txt

実行結果:

1
symbolic_link.txt: ASCII text

シンボリックリンク先のファイルが判定されます。

例8: 圧縮ファイル内も判定(-zオプション)

1
file -z archive.tar.gz

実行結果:

1
archive.tar.gz: gzip compressed data, from Unix, original size 1024

圧縮ファイルの詳細情報も表示されます。

Tips・注意点

マジックナンバーで判定

fileコマンドはファイルの先頭にあるマジックナンバー(ファイル形式の識別子)で判定します。拡張子は一切見ません。

1
2
# .txtという拡張子でもPNG画像なら
file image.png.txt

結果はPNG image dataとなります。

ディレクトリの判定

1
file /home

実行結果:

1
/home: directory

ディレクトリとしてちゃんと認識されます。

存在しないファイル

1
file nonexistent.txt

実行結果:

1
nonexistent.txt: cannot open (No such file or directory)

エラーメッセージが表示されます。

標準入力から判定

1
echo "hello" | file -

パイプから受け取ったデータも判定できます。

実践的な使い方

Webアプリケーションのファイルアップロード検証

1
file -i uploaded_file

アップロードされたファイルの実際の種類をMIMEタイプで確認できます。セキュリティのために拡張子だけに頼らず、実際の内容を検証するのが大切。

スクリプト内でファイル種別判定

1
2
3
4
5
if file -i "$1" | grep -q "text/"; then
  echo "テキストファイルです"
else
  echo "テキストファイルではありません"
fi

スクリプト内でファイルの種類に応じて処理を分岐させられます。

ディレクトリ内すべてのファイルを一括判定

1
file *

カレントディレクトリ内のすべてのファイルの種類が一度に表示されます。

拡張子が違うファイルを見つける

1
2
3
4
5
for f in *.txt; do
  if ! file -i "$f" | grep -q "text/"; then
    echo "拡張子が不正: $f"
  fi
done

.txtという拡張子だが、実際にはテキストファイルではないファイルを見つけられます。

まとめ

fileコマンドのポイント:

  • ファイルの種類を内容で判定する外部コマンド
  • マジックナンバーで判定(拡張子は見ない)
  • -iオプションでMIMEタイプ表示
  • -bオプションでファイル名非表示
  • -Lオプションでシンボリックリンク先を判定
  • 複数ファイルを同時に指定可能
  • セキュリティ検証に重要

fileコマンドは、ファイルの真の姿を教えてくれる信頼できるツール。拡張子に騙されずに、ファイルの内容を正しく理解しましょう!