【Linux】fileコマンドでファイルの種類やエンコーディングを判定する

目次

概要

Linuxにおいて、拡張子に頼らずに「ファイルの中身(ヘッダー情報やマジックナンバー)」を読み取って、そのファイルが画像なのか、テキストなのか、実行プログラムなのかを正確に識別するためのコマンドです。

「拡張子がない謎のファイル」や「拡張子が間違っているファイル」の正体を特定したり、テキストファイルの文字コード(エンコーディング)を確認する際にも重宝されます。

仕様(引数・オプション)

構文

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

主な引数・オプション

オプション説明
-bファイル名を表示せず、結果(ファイルの種類)のみを出力します(brief)。
-i人間が読みやすい形式ではなく、MIMEタイプ文字列(例: text/plain)を出力します。
-Lシンボリックリンクの場合、リンクそのものではなくリンク先の実体を判定します。
-z圧縮ファイルの中身を展開せずに判定しようと試みます。
-s特殊ファイル(ブロックデバイス等)の中身も読み取って判定します。
-F <文字>ファイル名と結果の間の区切り文字(デフォルトはコロン :)を変更します。
-k最初に一致したものだけでなく、一致する可能性のある種類をすべて表示します。

基本の使い方

ファイルを指定して実行すると、そのファイルの種類が表示されます。

コマンド

テキストファイル、実行ファイル(バイナリ)、暗号化データなどを判定する基本的な例です。

# テキストファイルを判定
file document.txt

# システムコマンド(実行バイナリ)を判定
file /usr/bin/ls

# 暗号化されたデータなどを判定
file secret.gpg

実行結果

document.txt: ASCII text
/usr/bin/ls:  ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked...
secret.gpg:   GPG key public ring, created Fri Jan 17 10:00:00 2026

実践コマンド

MIMEタイプと文字コードを表示する

スクリプトでの自動処理や、Webサーバーの設定確認などで最もよく使われる形式です。-i オプションを使うことで、text/html; charset=utf-8 のような形式で出力されます。

# ディレクトリ内の全ファイルのMIMEタイプを表示
file -i *
image.png:    image/png; charset=binary
index.html:   text/html; charset=utf-8
script.py:    text/x-python; charset=us-ascii
archive.zip:  application/zip; charset=binary

ファイル名を表示せず結果だけ取得する

シェルスクリプトの変数に代入する場合など、ファイル名の表示が邪魔な場合に使用します。

# data.bin の種類だけを表示
file -b data.bin
data

圧縮されたファイルの中身を調べる

gzipなどで圧縮されたファイルについて、解凍せずに元のファイル形式を推測します。

# 圧縮ファイルの中身を確認
file -z backup.tar.gz
backup.tar.gz: POSIX tar archive (gzip compressed data, from Unix, original size modulo 512 10240)

カスタムポイント

  • 区切り文字の変更: ファイル名やパスにコロンが含まれていて解析しにくい場合、-F "=>" のように区切り文字を変更して視認性を上げることができます。
  • 文字コード判定: file -i の結果に含まれる charset=xxx は、文字化けの原因調査に役立ちます(ただし、UTF-8やASCII以外の判定精度は専用ツール nkf に劣る場合があります)。
  • シンボリックリンク: デフォルトでは「これはシンボリックリンクです」としか教えてくれませんが、-L をつけることで「リンク先のファイルは何なのか」を調査できます。

注意点

  1. 判定は100%ではない:file コマンドはファイル先頭のデータ(マジックナンバー)を見て判断しています。ヘッダーが破損しているファイルや、特徴のないバイナリデータは正しく判定できず単に data と表示されることがあります。
  2. 拡張子との矛盾:Linuxではファイル名(拡張子)は動作に本質的な影響を与えません。image.jpg という名前でも中身がテキストファイルであれば、file コマンドは ASCII text と判定します。
  3. 空ファイルの扱い:サイズが0のファイルに対して実行すると empty と出力されます。

応用

特定のファイル種類だけを抽出して処理する

file コマンドの結果を利用して、ディレクトリ内の「画像ファイルだけ」を別の場所に移動するなどの処理に応用できます。

# カレントディレクトリのファイルから "image" と判定されたものだけを表示
for f in *; do
  if file -b --mime-type "$f" | grep -q "^image/"; then
    echo "$f is an image file."
  fi
done
photo.jpg is an image file.
logo.png is an image file.

まとめ

fileコマンドは、拡張子が信用できないLinux環境において、ファイルの真の姿を明らかにするための基本ツールです。特に -i オプションによるMIMEタイプ確認は、Webアプリケーションの開発やサーバー管理において、Content-Typeヘッダーの正当性を検証する際などに頻繁に使用されます。未知のファイルを操作する際は、catコマンドなどで開いて端末が文字化けする事故を防ぐためにも、まずこのコマンドでテキストかバイナリかを確認する習慣をつけることが推奨されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次