ファイルタイプの判別

LinuxBeginner
オンラインで実践に進む

はじめに

Windows や macOS では、ファイル拡張子を見れば、そのファイルの種類が分かることに慣れているでしょう。.jpg で終わっていれば画像、.exe で終わっていればプログラムだと判断します。

しかし Linux では、ファイル名は単なるラベルです。現実のラベルと同じように、そのラベルが間違っていることもあります。塩の入った瓶に「砂糖」と書いても、中身の味は塩のままです。

Linux はラベル(ファイル名)をそのまま信用しません。ファイルの内容を調べて、実際に何であるかを確認します。

これは Unix における、より広い考え方にもつながります。データの意味は、名前だけでなく、どのように構成され、どのように使われるかによって決まることが多いのです。ファイル拡張子は人間にとって便利な手がかりですが、最終的な判断材料ではありません。

この実験では、ファイル名に関係なく、ファイルの本当の種類を確認するために file コマンドを使います。

このスキルは、実際の運用作業で役立ちます。ダウンロードしたファイル、ログ、ダンプ、スクリプト、名前を偽装した不審な添付ファイルなどを扱うことがあるためです。ファイルを開いたり、実行したり、編集したりする前に、実際の種類を確認することが重要です。

テキストファイルを確認する

まずは、名前どおりのファイルから確認します。

最初に、プロジェクトディレクトリへ移動します。

cd ~/project
ls -l

welcome.txt が表示されます。.txt というラベルから、テキストファイルだと考えられます。しかし、ラベルは信用しないことを思い出してください。

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

file welcome.txt

次のような出力が表示されます。

welcome.txt: ASCII text

file はファイルの内容を確認し、「これは ASCII テキストです」と判断しました。

cat、less、テキストエディターなどのコマンドは、ファイルがテキストであると分かっている場合に安全かつ効果的に使えます。file コマンドは、その判断を安全に行うために役立ちます。

このファイルは安全に読み取れます。cat などのコマンドを使って内容を表示できます。

cat welcome.txt

バイナリファイルを確認する

ls、mkdir、cat などのシステムプログラムは、テキストファイルではありません。コンピューターのプロセッサーだけが理解できる形式で書かれた、バイナリファイルです。

ls コマンドそのものを確認してみましょう。このコマンドは /bin フォルダーにあります。

file で種類を確認します。

file /bin/ls

出力は少し難しそうに見えるかもしれませんが、多くの情報が含まれています。

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

慌てる必要はありません。次のように読み取ります。

  • ELF:Linux の標準的なプログラム形式です。Windows における .exe に相当します。
  • executable:実行できるプログラムです。

ELF は Executable and Linkable Format の略で、多くの Linux システムで使われている標準的なバイナリ形式です。正式名称を覚える必要はありませんが、ELF と表示されたら「これは Linux の実行ファイルだ」と認識できると便利です。

重要なのは、file がこのファイルを executable(実行ファイル) と判定したことです。cat /bin/ls を実行すると、画面に意味不明な記号が大量に表示されます。ファイルがバイナリだと分かれば、「これは読み取るのではなく、実行するものだ」と判断できます。

不明なファイルを識別する

ここからは探偵のように調べていきます。プロジェクトフォルダーには、mystery_file と fake_image.jpg という 2 つの不審なファイルがあります。

ケース 1:拡張子のないファイル

mystery_file には拡張子がありません。これはテキストファイルでしょうか。それともプログラムでしょうか。

確認してみます。

file mystery_file

結果は次のようになります。

mystery_file: PNG image data, ...

分かりました。これは PNG 画像 です。名前のタグがなくても、Linux はファイル内部にある PNG のシグネチャを識別しました。

ケース 2:うそをつくファイル

次に fake_image.jpg を確認します。ラベルには「JPEG 画像」と書かれています。しかし、本当に画像でしょうか。

file fake_image.jpg

結果は次のようになります。

fake_image.jpg: ASCII text

ラベルはうそでした。実際には、単なるテキストファイルです。

テキストファイルだと分かったので、安全に内容を読み取れます。

cat fake_image.jpg

ファイル名ではなく、内容 に基づいてファイルを識別するこのスキルこそ、Linux の初心者と熟練者を分けるものです。

これが、Linux が一部のデスクトップ OS ほど拡張子に依存していないように感じられる理由の 1 つでもあります。拡張子は便利な慣習ですが、システムはファイル自体を調べることで、より正確に判断できる場合があります。

まとめ

ラベルだけを見ずに、ファイルの本当の種類を確認する方法を学びました。

  • **file filename**:ファイルの実際の種類を調べるコマンドです。
  • 拡張子はうそをつくことがある:.jpg でも、必ずしも画像とは限りません。
  • 拡張子がなくても問題ない:Linux は拡張子がなくても、ファイルの種類を確認できます。

これで、実際の環境で未知のファイルに遭遇しても、適切に対処できるようになりました。