カテゴリ: Linuxコマンド集 更新日: 2026/06/03

cmpコマンドの-iオプションを徹底解説!ファイルの差分をスキップして比較する方法

cmp -iオプション(+NUM形式)|古い書き方との違いを解説
cmp -iオプション(+NUM形式)|古い書き方との違いを解説

先生と生徒の会話形式で理解しよう

生徒

「Linuxで2つのファイルが同じかどうか調べたいとき、どうすればいいですか?」

先生

「そんなときはcmpというコマンドを使います。2つのファイルを先頭から1文字ずつ見比べてくれるんですよ。」

生徒

「便利ですね!でも、例えばファイルの最初の方は無視して、途中から比較したいときはどうするんですか?」

先生

「鋭いですね。その場合は-iというオプションを使えば、指定した文字数分だけ飛ばして比較を開始できるんです。今日はその使い方を詳しく教えますね。」

1. cmpコマンドの基本を知ろう

1. cmpコマンドの基本を知ろう
1. cmpコマンドの基本を知ろう

cmpコマンドは、英語の「compare(比較する)」を短くした名前のコマンドです。その名の通り、2つのファイルの内容が完全に一致しているかどうかを確認するために使われます。

パソコンを触ったことがない方にとって、ファイルの中身を目で見て比べるのは大変な作業ですよね。1文字でも違えば、プログラムが動かなくなったり、データが壊れたりすることもあります。cmpを使えば、人間よりも速く、正確に違いを見つけ出してくれます。

ターミナルと呼ばれる黒い画面にコマンドを打ち込むだけで、どこが違っているのかを文字数や行数で教えてくれるのが特徴です。まずは基本の形を覚えておきましょう。

2. -iオプションとは何か?

2. -iオプションとは何か?
2. -iオプションとは何か?

今回詳しく解説する-iオプションは、「指定したバイト数(文字数)だけ読み飛ばす」ための機能です。正式には「ignore-initial」といいます。直訳すると「最初の部分を無視する」という意味になります。

なぜこのような機能が必要なのでしょうか。例えば、データの先頭に「作成日時」などのヘッダー情報が入っている場合、そこは違っていてもいいけれど、その後に続く「本当のデータ部分」だけを比較したい、という場面があります。そんなときに、このオプションを使って先頭をスキップさせるのです。

比較の開始地点をずらすことができるため、非常に柔軟なデータチェックが可能になります。最新の書き方では、単に飛ばす数字を書くだけでなく、2つのファイルに対して別々のスキップ数を指定することもできます。

3. 最新の書き方と古い書き方の違い

3. 最新の書き方と古い書き方の違い
3. 最新の書き方と古い書き方の違い

cmpコマンドの-iオプションには、古い書き方と新しい書き方の2種類が存在します。初心者の方は、混乱しないようにこの違いを整理しておきましょう。

昔から使われている古い形式では、スキップしたい数字を直接オプションの後に書く方法が一般的でした。しかし、これでは「ファイルAは10文字飛ばして、ファイルBは20文字飛ばす」といった細かい指定が少し分かりにくかったのです。

最新のLinux環境(GNU版)では、「+NUM」形式という書き方が推奨されています。具体的には、-i 10:20のようにコロンを使って、それぞれのファイルに対するスキップ数を明確に分けられるようになっています。この「+」記号を意識した指定方法は、他のコマンドとも共通点があり、より直感的に「ここから先を処理する」というイメージが湧きやすくなっています。

4. 実際に使ってみよう!基本の比較

4. 実際に使ってみよう!基本の比較
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文字飛ばす例

5. -iオプションで先頭を5文字飛ばす例
5. -iオプションで先頭を5文字飛ばす例

では、いよいよ-iオプションを使ってみましょう。ファイルの最初の5文字に余計な記号が入っているけれど、6文字目からは同じはずだ、という場合に便利です。

ここでは、両方のファイルを5文字目まで無視して比較を開始する命令を出してみます。この「5文字」という単位は、厳密には「バイト」というデータの大きさの単位ですが、初心者の方は「5文字分」と考えて差し支えありません。


cmp -i 5 test1.txt test2.txt

このように実行して、もし何も表示されなければ、5文字飛ばした後の内容はすべて一致しているということになります。もし6文字目以降に違いがあれば、その場所を教えてくれます。このように、特定の範囲を除外してチェックできるのが最大のメリットです。

6. ファイルごとに異なるスキップ数を指定する

6. ファイルごとに異なるスキップ数を指定する
6. ファイルごとに異なるスキップ数を指定する

次に、高度な使い方に挑戦してみましょう。「ファイル1は最初の10文字を飛ばし、ファイル2は最初の20文字を飛ばして比較したい」というケースです。これは、一方のファイルにだけ長い説明文がついている場合などに役立ちます。

最新のLinuxで推奨されるコロンを使った書き方を見てみましょう。数字を2つ並べて、その間をコロンでつなぎます。


cmp -i 10:20 sample1.dat sample2.dat

このコマンドの意味は以下の通りです。

  • sample1.datは、最初の10文字を読み飛ばす。
  • sample2.datは、最初の20文字を読み飛ばす。
  • その後のデータが一致しているかチェックする。
これを知っておくと、データの構造が少し違うファイル同士でも、必要な部分だけをピンポイントで比較できるようになります。

7. 比較結果をもっと詳しく表示する -lオプション

7. 比較結果をもっと詳しく表示する -lオプション
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. エラーや注意点について

8. エラーや注意点について
8. エラーや注意点について

コマンドを使っていると、思い通りの結果にならないこともあります。例えば、存在しないファイルの名前を指定してしまった場合、Linuxはエラーメッセージを返します。これもターミナルとの対話の一部です。

「No such file or directory」と表示されたら、「そんな名前のファイルはないよ」という意味です。ファイル名が間違っていないか、今の場所に本当にあるかを確認しましょう。また、読み飛ばす数(スキップ数)がファイルそのもののサイズよりも大きい場合も、比較ができずにエラーになります。

特に-iオプションで大きな数字を入れるときは、そのファイルが本当にそれ以上の文字数を持っているかを確認してから実行するようにしましょう。慎重に操作することで、コマンド操作のミスを減らすことができます。

9. diffコマンドとの違いを整理

9. diffコマンドとの違いを整理
9. diffコマンドとの違いを整理

Linuxには、比較を行うコマンドとしてdiffというものも存在します。よく似ていますが、使い分けが重要です。cmpは主に「画像」や「動画」などのバイナリファイル、あるいは「完全に一致するかどうかだけ知りたい」時に使います。一方で、diffは「テキストファイル」の中身を人間が読みやすい形で、どう修正すべきかを表示するのに向いています。

cmpの強みは、処理の速さと、文字単位での正確な位置特定です。プログラムの設定ファイルや、システムの大事なデータをチェックするときには、まずはcmpで不一致を確認し、その後にdiffで具体的にどこを直すか検討する、という流れが一般的です。初心者のうちは、この2つを「精密検査のcmp」と「読みやすさのdiff」と覚えておけば完璧です。

10. キーワード解説とよくある質問

10. キーワード解説とよくある質問
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 -lduコマンドでファイルサイズを確認する習慣をつけましょう。


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オプションについても調べてみると、さらに理解が深まりますよ。」

カテゴリの一覧へ
新着記事
New1
テキスト・データ処理
patch -Rオプションの使い方を完全ガイド!初心者でもわかるLinuxでパッチを元に戻す方法
New2
テキスト・データ処理
less -Xオプションの使い方を完全ガイド!終了後も画面内容を残す方法
New3
ファイル・ディレクトリ操作
lsコマンドの-lオプションでファイルの詳細情報を一覧表示しよう!初心者でもわかる使い方と意味を徹底解説
New4
ディスクとファイルシステム管理
dfコマンドの使い方を完全ガイド!初心者でもわかるLinuxのディスク使用量確認方法
人気記事
No.1
Java&Spring記事人気No1
テキスト・データ処理
catコマンドとは?Linuxでファイル内容を表示・連結する基本
No.2
Java&Spring記事人気No2
ファイル・ディレクトリ操作
cd ~ の使い方を完全解説!ホームディレクトリへの移動方法と初心者向けLinuxコマンド入門
No.3
Java&Spring記事人気No3
ファイル・ディレクトリ操作
pwdコマンドとは?初心者でもわかる現在の作業ディレクトリの確認方法を解説!
No.4
Java&Spring記事人気No4
ファイル・ディレクトリ操作
lsコマンドとは?Linuxでファイルやディレクトリを一覧表示する基本を初心者向けに解説