Linuxでサーバーを運用していると、拡張子がないファイルや、見慣れない形式のファイルに出くわすことがあります。Windowsのように拡張子でファイルの種類を判断する習慣があると、拡張子のないLinuxファイルの正体がわからず困った経験はないでしょうか。
この記事では、fileコマンドの基本的な使い方から、MIME形式の判定、findコマンドとの組み合わせ、シェルスクリプトでの活用まで、実務で使える知識を体系的に解説します。
・-i オプションで MIME タイプを表示し、スクリプトでの条件分岐に活用できる
・シンボリックリンクの実体を調べるには -L オプションを使う
・find コマンドと組み合わせることで、特定種別のファイルを一括検索できる
・シェルスクリプト内でファイル種別を自動判別し、処理を振り分ける実務テクニック
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜfileコマンドが必要なのか
Linuxではファイルの拡張子に特別な意味はありません。.txtという拡張子をつけたバイナリファイルも作れますし、拡張子なしのシェルスクリプトも普通に動きます。つまり、拡張子だけを見てファイルの中身を判断するのは危険です。
fileコマンドは、ファイルの中身(マジックナンバーやバイト列)を解析して、そのファイルが何者なのかを教えてくれます。拡張子に頼らず、ファイルの実体を正確に判定できるのがfileコマンドの強みです。
具体的には、fileコマンドは
/usr/share/misc/magic(またはmagic.mgc)というデータベースを参照して判定を行います。このデータベースには、各ファイル形式の先頭バイト列のパターンが登録されています。fileコマンドの基本的な使い方
1. ファイルの種類を調べる
最もシンプルな使い方です。fileコマンドにファイルパスを渡すだけで、ファイルの種類を表示してくれます。# テキストファイルの判定 $ file /etc/hosts /etc/hosts: ASCII text # バイナリ(実行ファイル)の判定 $ file /usr/bin/ls /usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked # ディレクトリの判定 $ file /tmp /tmp: directory # シェルスクリプトの判定 $ file /usr/bin/bashbug /usr/bin/bashbug: Bourne-Again shell script, ASCII text executable
2. 複数ファイルをまとめて調べる
fileコマンドにはスペース区切りで複数のファイルを渡せます。# 複数ファイルを一度に調べる $ file /etc/hosts /etc/hostname /etc/resolv.conf /etc/hosts: ASCII text /etc/hostname: ASCII text /etc/resolv.conf: ASCII text
-fオプションでファイルリストを渡す方法が便利です。# ファイルリストを作成 $ ls /etc/*.conf > /tmp/filelist.txt # リストに記載されたファイルをまとめて判定 $ file -f /tmp/filelist.txt
3. MIME形式で表示する(-i / --mime)
-iオプションを使うと、MIME(Multipurpose Internet Mail Extensions)形式でファイルタイプを表示します。Webサーバーの設定やスクリプトでの判定処理で活用できます。# MIME形式で表示 $ file -i /etc/hosts /etc/hosts: text/plain; charset=us-ascii # HTMLファイル $ file -i /var/www/html/index.html /var/www/html/index.html: text/html; charset=utf-8 # バイナリファイル $ file -i /usr/bin/ls /usr/bin/ls: application/x-pie-executable; charset=binary
text/plainやtext/htmlのようにMIMEタイプが表示され、さらにcharset=で文字コード情報も確認できます。ファイル名部分を省略して、MIMEタイプだけを取得したい場合は
-b(brief)オプションを組み合わせます。# ファイル名を省略してMIMEタイプだけ表示 $ file -bi /etc/hosts text/plain; charset=us-ascii
4. シンボリックリンクの実体を調べる(-L)
通常、fileコマンドはシンボリックリンク(symlink)自体の情報を表示します。リンク先の実体を調べたい場合は-Lオプションを使います。# シンボリックリンクの情報を表示(デフォルト) $ file /etc/alternatives/java /etc/alternatives/java: symbolic link to /usr/lib/jvm/java-11-openjdk-amd64/bin/java # -L でリンク先の実体を調べる $ file -L /etc/alternatives/java /etc/alternatives/java: ELF 64-bit LSB pie executable, x86-64
/etc/alternatives/ディレクトリなどで、実体のファイルタイプを確認したい場合に便利です。5. 圧縮ファイルの中身を調べる(-z)
-zオプションを使うと、圧縮ファイルの中のファイルタイプまで調べてくれます。# 圧縮ファイルの種類を確認(通常) $ file backup.tar.gz backup.tar.gz: gzip compressed data, last modified: Mon Mar 23 10:00:00 2026 # -z で中身まで確認 $ file -z backup.tar.gz backup.tar.gz: POSIX tar archive (gzip compressed data, last modified: Mon Mar 23 10:00:00 2026)
/var/log/messages-*.gzなど)の中身を確認する際にも使えます。応用・実務Tips
findと組み合わせてファイルを分類する
findコマンドの-execオプションとfileコマンドを組み合わせると、特定のディレクトリ配下にあるファイルの種類を一括で調べられます。# /usr/local/bin 配下の全ファイルの種類を調べる $ find /usr/local/bin -type f -exec file {} \; # テキストファイルだけを抽出する $ find /usr/local/bin -type f -exec file {} \; | grep "text" # ELFバイナリだけを抽出する $ find /usr/local/bin -type f -exec file {} \; | grep "ELF"
シェルスクリプトでファイル種別を判定する
シェルスクリプトの中でfileコマンドの出力を使い、ファイルの種類に応じて処理を分岐させることができます。#!/bin/bash # ファイルの種別に応じて処理を分岐するスクリプト TARGET="$1" if [ -z "$TARGET" ]; then echo "使い方: $0 ファイルパス" exit 1 fi FILETYPE=$(file -b "$TARGET") case "$FILETYPE" in *"text"*) echo "テキストファイルです: $FILETYPE" ;; *"ELF"*) echo "実行バイナリです: $FILETYPE" ;; *"gzip"*|*"bzip2"*|*"XZ"*) echo "圧縮ファイルです: $FILETYPE" ;; *"directory"*) echo "ディレクトリです" ;; *) echo "その他のファイルです: $FILETYPE" ;; esac
-bオプションを付けることでファイル名部分が省略され、スクリプト内での文字列比較がやりやすくなります。MIME形式で判定したい場合は、
file -biを使うとさらに正確な分岐が可能です。# MIME形式で判定してContent-Typeとして利用する例 MIMETYPE=$(file -bi "$TARGET") echo "Content-Type: $MIMETYPE"
文字コードの確認に使う
fileコマンドの-iオプションは、ファイルの文字コード(charset)も表示してくれます。文字化けの原因調査で非常に役立ちます。# 文字コードを確認 $ file -i config.txt config.txt: text/plain; charset=utf-8 $ file -i legacy_data.csv legacy_data.csv: text/plain; charset=iso-8859-1 $ file -i japanese.txt japanese.txt: text/plain; charset=utf-8
トラブルシュート・エラー対処
「cannot open」が出た時の対処法
fileコマンドで「cannot open」エラーが出る場合、主に以下の原因が考えられます。・ファイルが存在しない:パスのタイプミスを確認しましょう
・読み取り権限がない:sudoを付けて実行するか、権限を確認しましょう
# 権限がない場合のエラー例 $ file /etc/shadow /etc/shadow: regular file, no read permission # sudoを付けて実行 $ sudo file /etc/shadow /etc/shadow: ASCII text
/etc/shadowのようにroot権限でしか読めないファイルは、sudoを使って実行してください。ファイルタイプが「data」と表示される場合
fileコマンドが「data」とだけ表示する場合、マジックデータベースにそのファイル形式のパターンが登録されていないことを意味します。# 不明なバイナリファイル $ file unknown_file unknown_file: data
・hexdump や xxd で先頭バイトを確認する:マジックナンバーを手動で調べる
・fileコマンドのバージョンを確認する:古いバージョンではマジックデータベースが不足している場合がある
・ファイルが破損していないか確認する:途中でダウンロードが途切れたファイル等
# 先頭バイトを確認する $ xxd unknown_file | head -5 # fileコマンドのバージョンを確認 $ file --version
本記事のまとめ
fileコマンドの使い方を基本から応用まで解説しました。最後に、よく使うパターンを一覧表にまとめます。| やりたいこと | コマンド |
|---|---|
| ファイルの種類を調べる | file ファイル名 |
| ファイル名を省略して結果だけ表示 | file -b ファイル名 |
| MIME形式で表示する | file -i ファイル名 |
| MIME形式でファイル名を省略して表示 | file -bi ファイル名 |
| シンボリックリンクの実体を調べる | file -L ファイル名 |
| 圧縮ファイルの中身を調べる | file -z ファイル名 |
| ファイルリストから一括判定 | file -f リストファイル名 |
| ディレクトリ内の全ファイルを分類 | find パス -type f -exec file {} \; |
ファイルの正体をコマンドで確実に見抜けていますか?
コマンドの使い方を一つひとつ覚えていくのは時間がかかります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:catコマンドでファイル内容を表示する方法|結合やリダイレクトの使い方も
- 前のページへ:chgrpコマンドでグループを変更する方法|chownとの使い分けと-R一括変更
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドF-J・ファイル・ディレクトリ管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます