cmpコマンドの使い方を完全ガイド!初心者でもわかるLinuxのファイル比較の基本
生徒
「先生、Linuxで2つのファイルの内容が全く同じかどうかを調べたいときは、どうすればいいですか?」
先生
「そんなときはcmpコマンドを使うのが一番ですよ。ファイルの中身を1つずつ細かくチェックしてくれる命令です。」
生徒
「中身を全部読み比べるのは大変そうですね。初心者でも簡単に使いこなせますか?」
先生
「使い方はとてもシンプルです。2つのファイル名を指定するだけで、どこが違っているかすぐに教えてくれます。一緒に基本から見ていきましょう。」
1. cmpコマンドとは?
cmpコマンドは、Linuxにおいて2つのファイルが同一であるかを比較するためのコマンドです。「cmp」という名前は、英語の「compare(比較する)」という単語からきています。
このコマンドの最大の特徴は、ファイルを「バイト単位」で比較することです。バイトとは、パソコンが扱うデータの最小単位のようなものです。テキストファイルだけでなく、画像や音楽、プログラムの実行ファイルといった、人間が直接読めないデータ(バイナリファイル)の比較にも使われます。
例えば、大事なファイルをバックアップしたときに「コピーが失敗していないか」「1文字も間違いなくコピーできているか」を確認したいときに非常に役立ちます。一見同じに見えるファイルでも、内部的に1箇所でも違いがあれば、cmpコマンドは見逃しません。
2. cmpコマンドの基本的な使い方
まずは最もシンプルな使い方を確認しましょう。ターミナルで比較したい2つのファイルを指定して実行するだけです。もし2つのファイルが全く同じであれば、画面には何も表示されず、静かに終了します。これが「違いがない」という合図になります。
もし内容に違いがある場合は、最初に違いが見つかった場所(何行目の何バイト目か)を表示してくれます。これにより、ファイルの先頭からどこまでが同じだったのかを知ることができます。
以下の例では、test1.txtとtest2.txtという2つのファイルを比較しています。
cmp test1.txt test2.txt
test1.txt test2.txt differ: byte 9, line 1
実行結果の「differ: byte 9, line 1」という表示は、「1行目の9バイト目に違いがあります」という意味です。このように、不一致の箇所をピンポイントで教えてくれるのがcmpの便利なところです。
3. 詳しい情報を表示する -l オプション
標準の状態では、cmpコマンドは「最初に見つかった1箇所の違い」しか教えてくれません。しかし、ファイル全体でどこがどう違うのかをすべて把握したい場合もありますよね。そんな時に使うのが-lオプション(小文字のエル)です。
このオプションを付けると、すべての相違箇所について、その場所とそれぞれのファイルにある値を出力します。値は「8進数」という少し特殊な形式で表示されますが、プログラミングやシステム管理の現場では、データの化けを確認するために重宝されます。
実際にオプションを使って、複数の箇所が違うファイルを比較してみましょう。
cmp -l fileA.txt fileB.txt
5 141 142
12 157 160
この結果の見方は、左から順に「バイト番号」「1つ目のファイルの値」「2つ目のファイルの値」となっています。上記の例では、5バイト目と12バイト目に違いがあることがわかります。このように、全ての差分をリストアップしたい場合に最適です。
4. 違いを非表示にする -s オプション
-sオプションは「サイレントモード」と呼ばれます。画面には一切の結果を表示しません。一見すると意味がないように思えるかもしれませんが、実はこれがスクリプト作成や自動化の場面で非常に重要になります。
Linuxのコマンドは実行が終わると「終了ステータス」という数字をシステムに返します。同じなら「0」、違えば「1」という具合です。これを利用して、「もしファイルが同じならこの処理をする、違うなら別の処理をする」というプログラムを組むことができます。
初心者のうちはあまり使い道がないように感じますが、将来的に自動でデータの整合性をチェックする仕組みを作る際には欠かせない機能です。
cmp -s data1.bin data2.bin
この場合、画面には何も出ませんが、コンピュータ内部では比較が完了しています。パソコンを触ったことがない方でも、このように「あえて表示させない」使い道があることを知っておくと、ITの仕組みへの理解が深まります。
5. 比較を始める位置を指定する方法
cmpコマンドは、ファイルの先頭以外から比較を開始することもできます。例えば、「ファイルのヘッダー部分は無視して、中身のデータ部分だけを比較したい」といった高度な使い方が可能です。
ファイル名の後に数字を書くことで、そのバイト数分だけ読み飛ばしてから比較をスタートします。以下の例では、1つ目のファイルを10バイト、2つ目のファイルを20バイト飛ばして比較しています。
cmp log_old.log log_new.log 10 20
log_old.log log_new.log differ: byte 5, line 1
ここで表示される「byte 5」というのは、読み飛ばした後の地点から数えて5バイト目という意味ではなく、ファイル全体の先頭から数えた位置になります。少し計算が必要になりますが、特定の範囲だけをチェックしたいエンジニアにとっては必須の知識です。
6. diffコマンドとの違いを学ぼう
Linuxには、ファイルを比較するコマンドとして他にも有名なdiffコマンドがあります。よく似ていますが、使い分けが重要です。
diffコマンドは、主にテキストファイルの内容を行単位で比較し、「どのように変更すれば相手と同じになるか」という差分情報を表示することに特化しています。一方でcmpは、バイナリデータを含めて「1ビットの狂いもなく同じか」を素早く判定することに特化しています。
初心者の皆さんは、メモ帳などで書いた文章の違いを見たいときはdiff、バックアップしたデータの正確性を確かめたいときはcmpを使う、と覚えておけば間違いありません。
7. バイト単位の比較が必要なシーン
なぜ「行」ではなく「バイト」で比較する必要があるのでしょうか。例えば、画像ファイルを考えてみましょう。画像ファイルには「行」という概念がありません。データが途切れることなく連続して並んでいます。
もし、USBメモリに保存した大切な写真が壊れていないか確認したい場合、diffではうまく比較できません。そこでcmpの出番です。1バイトずつ厳密に調べることで、たった1つの点の色が変わってしまうような小さな破損も見つけ出すことができます。
また、ネットワーク経由で大きなファイルをダウンロードした際、途中で通信が途切れてデータが一部欠けてしまうことがあります。こうしたときにも、元データとダウンロードデータをcmpで比べることで、ファイルが正常であることを証明できます。
8. エラーメッセージへの対処法
コマンドを使っていると、思い通りの結果ではなくエラーが出ることもあります。cmpでよくあるのは「ファイルが見つかりません(No such file or directory)」というエラーです。これは、指定したファイル名が間違っているか、今いるディレクトリ(フォルダ)にそのファイルがないことを示しています。
また、「EOF(End Of File)に達しました」というメッセージが出ることもあります。これは、片方のファイルが途中で終わってしまい、もう片方のファイルにはまだ続きがある場合に表示されます。つまり、内容は同じだったけれど、ファイルの長さが違ったということです。
エラーが出ても焦らず、ファイル名や保存場所をlsコマンドなどで確認してみましょう。一歩ずつ慣れていくことが、Linuxマスターへの近道です。
まとめ
この記事では、Linux環境において非常に重要な役割を果たすcmpコマンドの基礎から応用までを詳しく解説してきました。cmpコマンドは、一見すると地味なツールに思えるかもしれませんが、データの整合性を保ち、システムの信頼性を維持するためには欠かせない存在です。特にバイナリファイルの比較や、巨大なバックアップファイルの検証において、その高速かつ厳密な処理能力は他の追随を許しません。
cmpコマンドの重要なポイントの再確認
これまでに学んだ内容を振り返り、実務や学習で役立つポイントを整理しましょう。SEOの観点からも、これらのキーワードを意識して理解を深めることが、Linuxスキル向上への近道となります。
- バイト単位の厳密な比較: テキストファイルだけでなく、画像、音声、実行バイナリなどのあらゆるデータを1バイトずつ正確に照合します。
- 高速な不一致検出: 最初の相違点を見つけた瞬間に処理を報告するため、非常に効率的です。
- 終了ステータスの活用: 同じなら「0」、異なれば「1」、エラーなら「2」を返す仕組みがあり、シェルスクリプトでの自動判定に最適です。
- 柔軟なオプション:
-lで全ての差分を表示し、-sで出力を抑制し、数値指定でオフセット(読み飛ばし)を設定できます。
実践的なサンプルプログラムとコマンド実行例
ここでは、実際の運用シーンを想定したコマンド操作の例をいくつか紹介します。一般ユーザー権限での実行と、システム深部のファイルを扱う際のルート権限での実行、それぞれのパターンを確認しておきましょう。
シナリオ1:バックアップファイルの整合性チェック(一般ユーザー)
ユーザーが自分のホームディレクトリにある設定ファイルをコピーし、正しくコピーされたかを確認する最も一般的なパターンです。
cp my_script.sh my_script_bak.sh
cmp my_script.sh my_script_bak.sh
何も表示されなければ、コピーは完璧に成功しています。もし、何らかの理由でファイルが壊れていた場合は、以下のように出力されます。
cmp my_script.sh my_script_bak.sh
my_script.sh my_script_bak.sh differ: byte 124, line 8
シナリオ2:システム設定ファイルの比較(ルートユーザー)
OSの重要な設定ファイル(例えば/etc/hostsなど)が、デフォルトの状態から変更されていないかを管理者が確認する場合、sudoを使用するかルート権限で実行します。
cmp /etc/hosts /etc/hosts.allow
/etc/hosts /etc/hosts.allow differ: byte 1, line 1
ルートユーザーでの実行が必要なのは、一般ユーザーに読み取り権限がないファイルを比較する場合です。権限エラーが出る場合は、ファイルパーミッションを確認する習慣をつけましょう。
cmpコマンドを使いこなすためのヒント
Linuxを学び始めたばかりの方は、まずは「2つのファイルが同じかどうかを調べるお守り」としてcmpを覚えておくと良いでしょう。少し慣れてきたら、diffコマンドとの使い分けを意識してください。
| 比較項目 | cmpコマンド | diffコマンド |
|---|---|---|
| 主な対象 | バイナリ・データ全般 | テキストファイル |
| 比較単位 | バイト単位 | 行単位 |
| 主な用途 | 破損確認・同一性検証 | プログラム修正箇所の確認 |
| 出力内容 | 位置(バイト/行) | 具体的な変更行の内容 |
このように、目的によってツールを使い分けることが、エンジニアとしての生産性を高める鍵となります。cmpは「完全一致」を求める際に最強のツールであることを忘れないでください。
生徒
「先生、cmpコマンドについてたくさんのことを学びました!最初は『diffがあるのに何でcmpが必要なのかな?』って思っていましたが、バイナリファイルやデータの整合性をチェックするのには、バイト単位で見てくれるcmpの方が確実なんですね。」
先生
「その通りです。よく理解できましたね。例えば、OSのアップデート中にファイルが壊れていないかを確認したり、暗号化されたデータが正しく復号できたかを調べたりする際、行という概念がないデータを扱うにはcmpが不可欠なんです。」
生徒
「なるほど。あと、オプションの使い分けも面白かったです。-sオプションは画面に何も出ないから不思議でしたが、シェルスクリプトの中で『もしファイルが一致したら次の処理に進む』という自動化に使われると聞いて、プログラミングの世界が広がった気がします。」
先生
「素晴らしい着眼点ですね。自動化はLinux運用の醍醐味ですから。cmp -sを使ってエラーチェックを自動化すれば、手動でファイルを1つずつ確認する手間が省けますし、ミスも防げます。これこそがITの効率化ですね。」
生徒
「もし2つのファイルの長さが違うときは、『EOFに達しました』というエラーが出ることも覚えました。これは内容自体はそこまで同じだったけれど、サイズが違うという合図なんですよね。これも大切な情報です。」
先生
「よく覚えていますね。ファイルサイズの違いも重要な手がかりになります。Linuxには他にもたくさんの便利なコマンドがありますが、まずはこのcmpのように、シンプルだけど強力な道具を1つずつ自分のものにしていきましょう。次は、複数のファイルをまとめて比較する方法なども学んでいくと、さらに楽しくなりますよ。」
生徒
「はい!ありがとうございます。今日学んだことを忘れないように、自分の環境でも実際にファイルをいくつか作って、わざと1文字だけ変えてcmpで比較する練習をしてみます!Linuxの操作がどんどん楽しくなってきました。」
先生
「その意気です。実際に手を動かして試行錯誤することが、一番の勉強になります。もし途中でエラーが出て困ったら、いつでも聞いてくださいね。コマンドの実行結果をよく読む癖をつければ、どんな問題も解決できるようになりますよ。」