fileコマンドとは?Linuxでファイルの種類・形式を確認する方法

Linux

Linuxで「このファイルは何の形式なのか」「拡張子が付いていないファイルの中身は何か」を調べたいときは、fileコマンドを使用します。

Windowsでは拡張子を見てファイルの種類を判断することが多いですが、Linuxでは拡張子が付いていないファイルも珍しくありません。また、拡張子が付いていても、実際の内容と一致しているとは限りません。

fileコマンドを使うと、ファイルの内容を調べて、テキストファイル、画像ファイル、圧縮ファイル、実行ファイル、シンボリックリンクなどの種類を判定できます。

この記事では、Linux初心者でも実際に操作できるように、fileコマンドの基本的な使い方、主なオプション、MIMEタイプや文字コードの確認方法、拡張子との違い、判定結果の見方まで実例付きで解説します。

  1. fileコマンドとは
  2. fileコマンドの基本構文
  3. テキストファイルの種類を確認する方法
  4. 拡張子がないファイルを確認する方法
  5. 拡張子を変更しても実体は変わらない
  6. 画像ファイルの種類を確認する方法
  7. 圧縮ファイルの種類を確認する方法
  8. 実行ファイルの種類を確認する方法
  9. シェルスクリプトの種類を確認する方法
  10. Pythonスクリプトを確認する方法
  11. 複数のファイルをまとめて確認する方法
  12. ファイル名を表示せず判定結果だけ表示する方法
  13. MIMEタイプを確認する方法
  14. MIMEタイプと文字コードをまとめて確認する方法
  15. 文字コードを確認する方法
  16. シンボリックリンクを確認する方法
    1. リンク先のファイル形式を確認する
  17. 圧縮ファイルの内部形式を調べる方法
  18. デバイスファイルを調べる方法
  19. fileコマンドの主なオプション
  20. fileコマンドはどのように種類を判定しているのか
  21. fileコマンドと拡張子の違い
  22. file・stat・lsコマンドの違い
  23. fileコマンドの実用例
    1. ダウンロードしたファイルの実体を確認する
    2. アップロードされたファイルのMIMEタイプを確認する
    3. ディレクトリ内のファイル形式をまとめて確認する
    4. 実行できないバイナリの種類を調べる
    5. 文字化けしたファイルの文字コードを確認する
  24. fileコマンドでよくあるエラーと対処法
    1. No such file or directory
    2. Permission denied
    3. dataとしか表示されない
    4. 文字コードの判定結果が期待と違う
  25. 利用環境による表示の違い
  26. よくある質問
    1. fileコマンドは拡張子を見て判定していますか?
    2. 拡張子と判定結果が違うのはなぜですか?
    3. MIMEタイプだけを確認するにはどうすればよいですか?
    4. 文字コードを確認するにはどうすればよいですか?
    5. シンボリックリンクのリンク先を調べられますか?
    6. dataと表示された場合は壊れていますか?
    7. ディレクトリにもfileコマンドを使用できますか?
    8. UbuntuやCentOS Streamでも使えますか?
  27. まとめ

fileコマンドとは

fileは、指定したファイルの種類や形式を判定するLinuxコマンドです。

ファイル名や拡張子だけではなく、ファイルの内容や先頭部分に記録された特徴を調べて判定します。

主に次のような情報を確認できます。

  • 通常のテキストファイルか
  • 画像・音声・動画などの形式
  • ZIPやgzipなどの圧縮形式
  • ELF形式の実行ファイルか
  • シェルスクリプトやPythonスクリプトか
  • シンボリックリンクか
  • 文字コードがUTF-8かASCIIか
  • MIMEタイプが何か

拡張子のないファイルを調査するときや、ダウンロードしたファイルの実体を確認するとき、サーバー上の不明なファイルを調査するときに役立ちます。

fileコマンドの基本構文

fileコマンドの基本構文は次のとおりです。

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

たとえば、sample.txtの種類を確認する場合は次のように実行します。

file sample.txt

実行結果の例です。

sample.txt: Unicode text, UTF-8 text

ファイル名の後ろに、そのファイルの種類や文字コードが表示されます。

テキストファイルの種類を確認する方法

動作確認用のテキストファイルを作成します。

echo "Hello Linux" > sample.txt

fileコマンドで確認します。

file sample.txt

実行結果の例です。

sample.txt: ASCII text

日本語を含むファイルでは、次のように表示されることがあります。

sample.txt: Unicode text, UTF-8 text

結果はファイルの内容や利用している環境によって異なります。

拡張子がないファイルを確認する方法

Linuxでは、拡張子がないファイルも多く存在します。

次のように拡張子のないファイルを作成します。

echo "Linux command" > sample

種類を確認します。

file sample

実行結果の例です。

sample: ASCII text

拡張子がなくても、内容を調べてテキストファイルだと判定できます。

拡張子を変更しても実体は変わらない

ファイル名の拡張子を変更しても、ファイルの中身や形式は変わりません。

たとえば、テキストファイルを画像のような名前へ変更します。

mv sample.txt sample.jpg

fileコマンドで確認します。

file sample.jpg

実行結果の例です。

sample.jpg: Unicode text, UTF-8 text

ファイル名は.jpgですが、中身はテキストファイルのままです。

拡張子はファイル名の一部であり、ファイル形式そのものを決めるものではありません。

画像ファイルの種類を確認する方法

画像ファイルへfileコマンドを実行すると、画像形式や解像度などが表示される場合があります。

file photo.png

実行結果の例です。

photo.png: PNG image data, 1000 x 666, 8-bit/color RGB, non-interlaced

JPEG画像の場合は次のように表示されます。

file photo.jpg
photo.jpg: JPEG image data, JFIF standard 1.01

画像が壊れている場合や、拡張子と実体が異なる場合の確認にも利用できます。

圧縮ファイルの種類を確認する方法

圧縮ファイルやアーカイブファイルの形式も確認できます。

file archive.zip

実行結果の例です。

archive.zip: Zip archive data, at least v2.0 to extract

gzip形式の場合は次のように表示されます。

file archive.gz
archive.gz: gzip compressed data

tarアーカイブの場合は次のように表示されます。

file archive.tar
archive.tar: POSIX tar archive

拡張子が間違っている圧縮ファイルを調査するときにも便利です。

実行ファイルの種類を確認する方法

Linuxの実行ファイルへfileコマンドを実行すると、ELF形式やCPUアーキテクチャなどを確認できます。

file /bin/ls

実行結果の例です。

/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked

主な表示項目の意味は次のとおりです。

表示 意味
ELF Linuxで一般的に使われる実行ファイル形式
64-bit 64ビット向けの実行ファイル
x86-64 x86-64 CPU向けに作成されている
dynamically linked 共有ライブラリを利用する実行ファイル

異なるCPU向けに作られた実行ファイルを実行できない場合などの調査に役立ちます。

シェルスクリプトの種類を確認する方法

シェルスクリプトを作成します。

printf '#!/bin/bash\necho "Hello"\n' > hello.sh

fileコマンドで確認します。

file hello.sh

実行結果の例です。

hello.sh: Bourne-Again shell script, ASCII text executable

先頭行のシェバンを確認し、Bashスクリプトとして判定されます。

Pythonスクリプトを確認する方法

Pythonスクリプトも同様に判定できます。

printf '#!/usr/bin/env python3\nprint("Hello")\n' > hello.py
file hello.py

実行結果の例です。

hello.py: Python script, ASCII text executable

ただし、ファイルの内容やシェバンの有無によっては、単なるテキストファイルとして判定されることもあります。

複数のファイルをまとめて確認する方法

複数のファイルを指定すると、まとめて種類を確認できます。

file sample.txt photo.png archive.zip

実行結果の例です。

sample.txt:  Unicode text, UTF-8 text
photo.png:   PNG image data, 1000 x 666, 8-bit/color RGB
archive.zip: Zip archive data

カレントディレクトリ内のファイルをまとめて調べる場合は、ワイルドカードを使用できます。

file *

ただし、ファイル数が非常に多いディレクトリでは大量の結果が表示されるため注意してください。

ファイル名を表示せず判定結果だけ表示する方法

-bオプションを使用すると、ファイル名を省略して判定結果だけを表示できます。

file -b sample.txt

実行結果の例です。

Unicode text, UTF-8 text

シェルスクリプトで判定結果だけを変数へ保存したい場合などに便利です。

type=$(file -b sample.txt)
echo "$type"

MIMEタイプを確認する方法

MIMEタイプだけを確認したい場合は、--mime-typeオプションを使用します。

file --mime-type sample.txt

実行結果の例です。

sample.txt: text/plain

PNG画像の場合は次のように表示されます。

file --mime-type photo.png
photo.png: image/png

MIMEタイプは、Webサーバーやメール、ファイルアップロード処理などで、データの種類を表すために使われます。

MIMEタイプと文字コードをまとめて確認する方法

-iオプションを使うと、MIMEタイプと文字コードをまとめて確認できます。

file -i sample.txt

実行結果の例です。

sample.txt: text/plain; charset=utf-8

-iは、環境によっては--mimeと同等の動作になります。

文字コードを確認する方法

文字コードだけを確認する場合は、--mime-encodingを使用します。

file --mime-encoding sample.txt

実行結果の例です。

sample.txt: utf-8

文字化けが発生しているファイルを調査するときに役立ちます。

ただし、短いファイルや英数字だけのファイルでは、UTF-8で作成していてもus-asciiと判定される場合があります。ASCII文字はUTF-8と互換性があるためです。

シンボリックリンクを確認する方法

シンボリックリンクを作成します。

ln -s sample.txt symbolic.txt

通常のfileコマンドでは、リンク自体が表示されます。

file symbolic.txt

実行結果の例です。

symbolic.txt: symbolic link to sample.txt

リンク先のファイル形式を確認する

-Lオプションを使用すると、シンボリックリンクをたどってリンク先の種類を判定します。

file -L symbolic.txt

実行結果の例です。

symbolic.txt: Unicode text, UTF-8 text

リンク自体を調べたい場合は通常のfile、リンク先の実体を調べたい場合はfile -Lを使用します。

圧縮ファイルの内部形式を調べる方法

-zオプションを使用すると、圧縮ファイルを展開可能な範囲で調べ、内部データの種類も表示します。

file -z archive.gz

実行結果の例です。

archive.gz: ASCII text (gzip compressed data)

環境や圧縮形式によって、表示内容は異なります。

デバイスファイルを調べる方法

-sオプションを使うと、ブロックデバイスやキャラクターデバイスなどの特殊ファイルも読み取って判定します。

sudo file -s /dev/sda1

ファイルシステムが存在する場合は、種類やUUIDなどが表示されることがあります。

デバイスファイルへ使用する場合は、対象を間違えないよう注意してください。通常のファイル確認では-sを付ける必要はありません。

fileコマンドの主なオプション

オプション 説明
-b ファイル名を表示せず判定結果だけを表示する
-i MIMEタイプと文字コードを表示する
--mime-type MIMEタイプだけを表示する
--mime-encoding 文字コードだけを表示する
-L シンボリックリンクのリンク先を判定する
-z 圧縮ファイルの内部データも調べる
-s 特殊ファイルやデバイスファイルも読み取る
-k 最初の判定だけで終了せず、該当する判定結果を続けて表示する

fileコマンドはどのように種類を判定しているのか

fileコマンドは、主に次の順序でファイルを調べます。

  1. ファイルが存在するか、ディレクトリやリンクなどの特殊ファイルかを確認する
  2. マジックナンバーなど、ファイル先頭の特徴を調べる
  3. 文字列として読み取れるかを確認し、テキストや文字コードを判定する

画像や圧縮ファイル、実行ファイルには、形式を識別するための特徴的なデータが含まれていることがあります。

fileコマンドは、システムに用意されたmagicデータベースと照合して種類を判定します。

fileコマンドと拡張子の違い

比較項目 拡張子 fileコマンド
判定方法 ファイル名を見る ファイルの内容を調べる
拡張子なし 種類を判断しにくい 判定できる場合がある
拡張子が間違っている場合 誤認しやすい 実体を判定できる場合がある
文字コード 確認できない 確認できる場合がある
MIMEタイプ 確認できない 確認できる

拡張子は目安として便利ですが、正確に確認したい場合はfileコマンドを使用します。

file・stat・lsコマンドの違い

コマンド 主な用途
file ファイルの種類や形式を確認する
stat サイズ、権限、所有者、inode、日時などを詳しく確認する
ls -l 複数ファイルの基本情報を一覧表示する

「何のファイルか」を調べるならfile、「どのような属性を持つか」を調べるならstat、「一覧で確認する」ならls -lが適しています。

fileコマンドの実用例

ダウンロードしたファイルの実体を確認する

file download_file

拡張子が付いていない場合や、ファイル名から形式が分からない場合に利用できます。

アップロードされたファイルのMIMEタイプを確認する

file --mime-type upload_file

Webアプリケーションやサーバー運用で、ファイルの種類を確認するときに便利です。

ディレクトリ内のファイル形式をまとめて確認する

file *

拡張子と実体が一致しているかをまとめて確認できます。

実行できないバイナリの種類を調べる

file application

32ビット・64ビットの違いや、CPUアーキテクチャが実行環境と合っているかを調査できます。

文字化けしたファイルの文字コードを確認する

file -i data.txt

表示された文字コードを参考に、iconvなどで変換できます。

fileコマンドでよくあるエラーと対処法

No such file or directory

file: cannot open 'sample.txt' (No such file or directory)

指定したファイルが存在しないか、パスが間違っています。

pwd
ls -l

現在のディレクトリとファイル名を確認してください。

Permission denied

file: cannot open 'sample.dat' (Permission denied)

対象ファイルまたは親ディレクトリへアクセスする権限がありません。

ls -l sample.dat
namei -l /path/to/sample.dat

ファイルとパス上のディレクトリに必要な権限があるか確認します。

dataとしか表示されない

sample.bin: data

既知の形式として判定できないバイナリデータの場合は、単にdataと表示されることがあります。

この場合は、次の方法を組み合わせて調査します。

hexdump -C sample.bin | head
strings sample.bin | head
stat sample.bin

fileコマンドだけですべてのファイル形式を特定できるわけではありません。

文字コードの判定結果が期待と違う

文字コード判定は、ファイルの内容から推測されます。

英数字だけの短いファイルでは、UTF-8で保存していてもus-asciiと表示されることがあります。日本語などの非ASCII文字を含めて確認すると、判定結果が変わる場合があります。

利用環境による表示の違い

fileコマンドの判定結果は、インストールされているfileコマンドのバージョンやmagicデータベースによって異なる場合があります。

そのため、Ubuntu、Debian、CentOS Stream、Rocky Linux、AlmaLinuxなどで、表示される表現が完全に同じになるとは限りません。

利用しているバージョンは次のコマンドで確認できます。

file --version

よくある質問

fileコマンドは拡張子を見て判定していますか?

いいえ。基本的にはファイルの内容や特徴を調べて判定します。そのため、拡張子がなくても種類を判定できる場合があります。

拡張子と判定結果が違うのはなぜですか?

拡張子はファイル名の一部にすぎないためです。名前を変更してもファイルの実体は変わりません。

MIMEタイプだけを確認するにはどうすればよいですか?

file --mime-type ファイル名

と実行します。

文字コードを確認するにはどうすればよいですか?

file --mime-encoding ファイル名

または次のコマンドを使用します。

file -i ファイル名

シンボリックリンクのリンク先を調べられますか?

-Lオプションを付けると、リンク先ファイルの種類を判定できます。

file -L symbolic.txt

dataと表示された場合は壊れていますか?

必ずしも壊れているとは限りません。fileコマンドが既知の形式として判定できなかったバイナリデータでもdataと表示されます。

ディレクトリにもfileコマンドを使用できますか?

はい。ディレクトリを指定すると、directoryと表示されます。

file /var/log

UbuntuやCentOS Streamでも使えますか?

はい。一般的なLinuxディストリビューションで利用できます。最小構成の環境でインストールされていない場合は、パッケージ管理コマンドでfileパッケージを追加します。

まとめ

fileコマンドは、Linuxでファイルの種類や形式を確認するためのコマンドです。

基本的な使い方は次のとおりです。

file ファイル名

判定結果だけを表示する場合は-bを使用します。

file -b sample.txt

MIMEタイプを確認する場合は、次のように実行します。

file --mime-type sample.txt

MIMEタイプと文字コードをまとめて確認する場合は-iを使用します。

file -i sample.txt

シンボリックリンクのリンク先を判定する場合は-Lを使用します。

file -L symbolic.txt

Linuxでは拡張子が付いていないファイルも多いため、ファイルの実体を確認できるfileコマンドは非常に重要です。

不明なファイルを見つけたときや、拡張子と中身が一致しているか確認したいときは、最初にfileコマンドを実行してみましょう。

コメント

タイトルとURLをコピーしました