cmpコマンドの-iオプションを徹底解説!ファイルの差分をスキップして比較する方法
生徒
「Linuxで2つのファイルが同じかどうか調べたいとき、どうすればいいですか?」
先生
「そんなときはcmpというコマンドを使います。2つのファイルを先頭から1文字ずつ見比べてくれるんですよ。」
生徒
「便利ですね!でも、例えばファイルの最初の方は無視して、途中から比較したいときはどうするんですか?」
先生
「鋭いですね。その場合は-iというオプションを使えば、指定した文字数分だけ飛ばして比較を開始できるんです。今日はその使い方を詳しく教えますね。」
1. cmpコマンドの基本を知ろう
cmpコマンドは、英語の「compare(比較する)」を短くした名前のコマンドです。その名の通り、2つのファイルの内容が完全に一致しているかどうかを確認するために使われます。
パソコンを触ったことがない方にとって、ファイルの中身を目で見て比べるのは大変な作業ですよね。1文字でも違えば、プログラムが動かなくなったり、データが壊れたりすることもあります。cmpを使えば、人間よりも速く、正確に違いを見つけ出してくれます。
ターミナルと呼ばれる黒い画面にコマンドを打ち込むだけで、どこが違っているのかを文字数や行数で教えてくれるのが特徴です。まずは基本の形を覚えておきましょう。
2. -iオプションとは何か?
今回詳しく解説する-iオプションは、「指定したバイト数(文字数)だけ読み飛ばす」ための機能です。正式には「ignore-initial」といいます。直訳すると「最初の部分を無視する」という意味になります。
なぜこのような機能が必要なのでしょうか。例えば、データの先頭に「作成日時」などのヘッダー情報が入っている場合、そこは違っていてもいいけれど、その後に続く「本当のデータ部分」だけを比較したい、という場面があります。そんなときに、このオプションを使って先頭をスキップさせるのです。
比較の開始地点をずらすことができるため、非常に柔軟なデータチェックが可能になります。最新の書き方では、単に飛ばす数字を書くだけでなく、2つのファイルに対して別々のスキップ数を指定することもできます。
3. 最新の書き方と古い書き方の違い
cmpコマンドの-iオプションには、古い書き方と新しい書き方の2種類が存在します。初心者の方は、混乱しないようにこの違いを整理しておきましょう。
昔から使われている古い形式では、スキップしたい数字を直接オプションの後に書く方法が一般的でした。しかし、これでは「ファイルAは10文字飛ばして、ファイルBは20文字飛ばす」といった細かい指定が少し分かりにくかったのです。
最新のLinux環境(GNU版)では、「+NUM」形式という書き方が推奨されています。具体的には、-i 10:20のようにコロンを使って、それぞれのファイルに対するスキップ数を明確に分けられるようになっています。この「+」記号を意識した指定方法は、他のコマンドとも共通点があり、より直感的に「ここから先を処理する」というイメージが湧きやすくなっています。
4. 実際に使ってみよう!基本の比較
まずは、オプションを使わずに単純に2つのファイルを比較してみましょう。ここでは「test1.txt」と「test2.txt」という2つのファイルを用意したと仮定します。中身が少しだけ違う場合、どのような結果が出るか確認してください。
cmp test1.txt test2.txt
test1.txt test2.txt differ: byte 9, line 1
上記の実行結果を見てみましょう。「differ(異なる)」という単語が表示されましたね。これは「9文字目の1行目が違いますよ」と教えてくれているのです。もし2つのファイルが完全に同じであれば、何も表示されずに終了します。何も出ないことが「合格」の証というわけですね。
5. -iオプションで先頭を5文字飛ばす例
では、いよいよ-iオプションを使ってみましょう。ファイルの最初の5文字に余計な記号が入っているけれど、6文字目からは同じはずだ、という場合に便利です。
ここでは、両方のファイルを5文字目まで無視して比較を開始する命令を出してみます。この「5文字」という単位は、厳密には「バイト」というデータの大きさの単位ですが、初心者の方は「5文字分」と考えて差し支えありません。
cmp -i 5 test1.txt test2.txt
このように実行して、もし何も表示されなければ、5文字飛ばした後の内容はすべて一致しているということになります。もし6文字目以降に違いがあれば、その場所を教えてくれます。このように、特定の範囲を除外してチェックできるのが最大のメリットです。
6. ファイルごとに異なるスキップ数を指定する
次に、高度な使い方に挑戦してみましょう。「ファイル1は最初の10文字を飛ばし、ファイル2は最初の20文字を飛ばして比較したい」というケースです。これは、一方のファイルにだけ長い説明文がついている場合などに役立ちます。
最新のLinuxで推奨されるコロンを使った書き方を見てみましょう。数字を2つ並べて、その間をコロンでつなぎます。
cmp -i 10:20 sample1.dat sample2.dat
このコマンドの意味は以下の通りです。
sample1.datは、最初の10文字を読み飛ばす。sample2.datは、最初の20文字を読み飛ばす。- その後のデータが一致しているかチェックする。
7. 比較結果をもっと詳しく表示する -lオプション
cmpコマンドには他にも便利なオプションがあります。-iと組み合わせてよく使われるのが、-lオプションです。これは「どこが違うか」だけでなく、「どう違うか(文字のコード番号)」をすべて一覧で表示してくれます。
「ここが違うのはわかったけれど、全部で何箇所あるの?」という時に使います。初心者の方は、まずはおまじないのように「詳しいリストを出すときは -l」と覚えておくと良いでしょう。バイト数(何文字目か)と、それぞれのファイルにある文字の値を数字で並べてくれます。
cmp -l -i 3 file_a.txt file_b.txt
4 141 142
5 151 152
上記の例では、最初の3文字を無視した上で、4文字目と5文字目に違いがあることを示しています。左側の数字が位置、右側の2つの数字がそれぞれのファイルの内容を指しています。最初は難しく感じるかもしれませんが、一覧が出るという点だけ理解しておけば大丈夫です。
8. エラーや注意点について
コマンドを使っていると、思い通りの結果にならないこともあります。例えば、存在しないファイルの名前を指定してしまった場合、Linuxはエラーメッセージを返します。これもターミナルとの対話の一部です。
「No such file or directory」と表示されたら、「そんな名前のファイルはないよ」という意味です。ファイル名が間違っていないか、今の場所に本当にあるかを確認しましょう。また、読み飛ばす数(スキップ数)がファイルそのもののサイズよりも大きい場合も、比較ができずにエラーになります。
特に-iオプションで大きな数字を入れるときは、そのファイルが本当にそれ以上の文字数を持っているかを確認してから実行するようにしましょう。慎重に操作することで、コマンド操作のミスを減らすことができます。
9. diffコマンドとの違いを整理
Linuxには、比較を行うコマンドとしてdiffというものも存在します。よく似ていますが、使い分けが重要です。cmpは主に「画像」や「動画」などのバイナリファイル、あるいは「完全に一致するかどうかだけ知りたい」時に使います。一方で、diffは「テキストファイル」の中身を人間が読みやすい形で、どう修正すべきかを表示するのに向いています。
cmpの強みは、処理の速さと、文字単位での正確な位置特定です。プログラムの設定ファイルや、システムの大事なデータをチェックするときには、まずはcmpで不一致を確認し、その後にdiffで具体的にどこを直すか検討する、という流れが一般的です。初心者のうちは、この2つを「精密検査のcmp」と「読みやすさのdiff」と覚えておけば完璧です。
10. キーワード解説とよくある質問
最後に、この記事で出てきた重要な用語を復習しましょう。
ターミナル:キーボードだけでパソコンに命令を出すためのアプリです。黒い画面が一般的です。
バイト:データの最小単位のようなものです。英数字1文字がだいたい1バイトに相当します。
オプション:コマンドの動きを少し変えるための追加の命令です。ハイフン(-)から始まります。
バイナリファイル:人間が直接読めない、コンピュータ用のデータファイルのことです。
パソコンの初心者でも、こうして一歩ずつコマンドを学んでいけば、プログラミングやシステム運用の基礎が身についていきます。cmp -iを使いこなして、データの管理をスマートに行っていきましょう!
まとめ
今回の記事では、Linux環境において非常に重要な役割を果たすcmpコマンド、特に-iオプション(ignore-initial)の活用方法について詳しく解説しました。cmpコマンドは、2つのファイルがバイナリレベルで一致しているかを高速に判定するためのツールです。通常の比較では、ファイルの先頭から1文字(1バイト)ずつチェックを行いますが、特定の条件下では「先頭の数文字を無視して比較したい」というニーズが発生します。
例えば、ファイルのヘッダー部分にタイムスタンプやシリアル番号などの固有情報が含まれている場合、その差異を無視して実データ部分のみを比較するために、-iオプションが極めて有効です。このオプションを使いこなすことで、ログファイルの分析や、プログラムのバイナリチェック、バックアップデータの整合性確認など、システム管理における作業効率が劇的に向上します。
cmpコマンドの応用と実戦的な使い方
cmpコマンドをより実戦で活用するためには、基本的な使い方に加えて、シェルスクリプト内での利用や、他のオプションとの組み合わせを理解することが大切です。cmpコマンドは、比較結果が一致した場合に終了ステータスとして「0」を返し、不一致の場合は「1」を返します。これを利用して、条件分岐の中でファイルチェックを行うことができます。
以下に、実戦でよく使われるテクニックをいくつか紹介します。
特定のオフセットを指定した比較の自動化
ファイルの構造が分かっている場合、スキップするバイト数をあらかじめ計算してコマンドを実行します。最新のGNU版cmpでは、10進数だけでなく、接頭辞を付けることで16進数(0x10など)での指定も可能です。これにより、低レイヤーのデバッグ作業が非常にスムーズになります。
cmp -i 0x10 data1.bin data2.bin
上記のコマンドは、16進数で10(10進数で16バイト)分をスキップして比較を開始します。
ファイルの一部を比較する際の注意点
-iオプションを使用する際、指定したオフセットがファイルサイズを超えていると、コマンドはエラーを返します。そのため、巨大なファイルを扱う場合は、事前にls -lやduコマンドでファイルサイズを確認する習慣をつけましょう。
ls -l sample.dat
-rw-r--r-- 1 user user 1024 Apr 1 10:00 sample.dat
このように、ファイルが1024バイトであれば、-iオプションで指定できる最大値は1023までとなります。
異なる位置からの比較(コロン区切り)
記事の本編でも触れた通り、-i SKIP1:SKIP2という形式は、非常に強力な機能です。これは、ファイルAの開始位置とファイルBの開始位置がずれている場合に、それらを同期させて比較できる唯一の方法と言っても過言ではありません。
cmp -i 100:200 original.img backup.img
original.img backup.img differ: byte 50, line 1
この結果は、original.imgの100バイト目とbackup.imgの200バイト目を「0番目」としてカウントし、そこから数えて50バイト目に差異があることを示しています。つまり、実質的にはファイル先頭から数えて150バイト目と250バイト目が異なっているという意味になります。
まとめ表:cmpコマンドの主なオプション
| オプション | 意味 | 主な活用シーン |
|---|---|---|
-i / --ignore-initial |
最初のnバイトを無視 | ヘッダー情報を除外して純粋なデータのみを比較したい時 |
-l / --verbose |
相違点の全リスト表示 | どこが、どのように違うのかをすべて把握したい時 |
-s / --silent |
出力を抑制 | シェルスクリプトで終了ステータスのみを利用したい時 |
-n / --bytes |
比較するバイト数を制限 | ファイルの一部(特定の範囲内)だけをチェックしたい時 |
生徒
「先生、ありがとうございました!cmpコマンドの-iオプション、最初は少し難しそうでしたが、実際に例を見るとすごく便利ですね。特にヘッダーを飛ばして比較できるのが面白いです。」
先生
「そう言ってもらえると嬉しいです。実務では、全く同じ内容のはずなのに、ファイルの先頭にメタデータが付いているせいで一致しない、ということがよくあるんですよ。そんな時、わざわざファイルを編集して削除しなくても、-iオプション一つで解決できるのがこのコマンドの強みです。」
生徒
「なるほど。ところで先生、さっき教えてもらった『コロン(:)』を使った指定方法ですが、これは一般ユーザー権限でも実行できるんですよね?」
先生
「もちろんです。ファイルの読み取り権限さえあれば、誰でも実行できますよ。やってみますか?」
生徒
「はい!手元のファイルで試してみます。」
cmp -i 10:10 file1.txt file2.txt
「あ、何も出ませんでした!ということは、10文字目以降は完全に一致しているってことですね。」
先生
「その通りです!完璧な理解ですね。もし管理者としてシステム全体のログファイルを比較するような場面があれば、ルートユーザーに切り替えて実行することもありますよ。」
生徒
「ルートユーザーの場合は、コマンドのプロンプトも変わるんでしたよね。」
先生
「よく覚えていますね。管理者の場合は、権限が非常に強いので操作には注意が必要ですが、実行方法は同じです。」
cmp -i 5 /var/log/syslog /var/log/syslog.old
「こうしてシステムの深いところにあるファイルを比較できるようになれば、Linuxマスターへの道も近いですよ。」
生徒
「ワクワクしますね!最後にもう一つ質問ですが、バイナリファイル以外の普通のテキストファイルでも、cmpを使っていいんですか?」
先生
「良い質問です。テキストファイルに使っても全く問題ありません。ただ、テキストファイルで『どこにどんな違いがあるか』を文章として見たい場合は、以前に話したdiffコマンドの方が便利かもしれません。cmpはあくまで『ビットやバイトのレベルで全く同じか』をストイックに調べるものだと思っておけば、使い分けに迷うことはありませんよ。」
生徒
「ストイックなcmp、覚えやすいです!今日も勉強になりました。ありがとうございました!」
先生
「こちらこそ。これからも一つずつ、Linuxのコマンドを楽しんで覚えていきましょう。次は、特定のバイト数だけ比較を限定する-nオプションについても調べてみると、さらに理解が深まりますよ。」