cmpコマンドの-iオプションをマスター!ファイルの差分をスキップして比較する方法
生徒
「二つのファイルが同じかどうか調べたいんですけど、最初の方だけ内容が違うことが分かっている場合はどうすればいいですか?」
先生
「それならcmpコマンドの-iオプションが便利ですよ。指定した文字数分だけ読み飛ばして、その先から比較を開始できるんです。」
生徒
「スキップできるんですね!でも、コマンド操作ってなんだか難しそうで不安です。」
先生
「大丈夫ですよ。基本的な使い方から、初心者の方にも分かりやすい具体例を交えてゆっくり解説していきますね。」
1. cmpコマンドと-iオプションの基本
Linux(リナックス)を使っていると、二つのファイルの内容が全く同じかどうかを確認したい場面がよくあります。そんな時に使うのがcmp(シーエムピー)コマンドです。この名前は英語の compare(比較する)からきています。
通常、cmpコマンドはファイルの先頭(一番最初の文字)から順番に一文字ずつ比較していきます。しかし、例えば「ファイルの先頭に日付が入っているけれど、そこは無視して中身のデータだけを比べたい」というときもありますよね。そんな時に役立つのが-iオプションです。
このオプションを使うと、ファイルの先頭から指定した数だけのバイト(文字数のようなもの)を読み飛ばして、その途中から比較を始めることができます。パソコンの世界では、アルファベットや数字1文字を1バイトという単位で数えることが多いです。
2. cmpコマンドの基本的な使い方
まずは、オプションをつけない一番シンプルなcmpコマンドの使い方を見てみましょう。ターミナル(コマンドを入力する黒い画面)に、次のように入力します。
cmp file1.txt file2.txt
file1.txt file2.txt differ: byte 1, line 1
もし二つのファイルの内容が完全に一致していれば、画面には何も表示されません。何も言わないのが「同じだよ」という合図です。逆に、少しでも違う部分があれば、上記のように「何行目の何文字目が違いますよ」と教えてくれます。上記の実行結果では、1行目の1文字目からすでに内容が違っていることがわかりますね。
3. -iオプションで先頭をスキップする
それでは、今回の主役である-iオプションを使ってみましょう。このオプションは、ignore(無視する)の頭文字をとったものです。使い方は、-iの後に読み飛ばしたい数字(バイト数)を書くだけです。
例えば、ファイルの最初の5文字分を無視して、6文字目から比較したい場合は、次のように入力します。
cmp -i 5 file1.txt file2.txt
このように実行して、何も表示されなければ「最初の5文字を除いた部分は全く同じ」ということになります。もし、6文字目以降に違う場所があれば、そこを指摘してくれます。初心者の方は、まずこの「数字を指定して読み飛ばす」という感覚を掴んでください。
4. バイトとは何か?初心者向けの解説
パソコンを初めて触る方にとって「バイト」という言葉は馴染みが薄いかもしれませんね。簡単に言うと、データの重さや大きさを表す単位のことです。テキストファイルの場合、半角の英数字1文字がだいたい1バイトに相当します。
例えば、「Hello」という言葉は5文字なので、5バイトになります。-i 5と指定すれば、「Hello」の部分を無視してその次からチェックを開始することになります。日本語の場合は、使っている文字コードによって1文字が3バイトだったりするので少し計算が複雑になりますが、まずは「1バイト = 半角1文字」というイメージで覚えておけば十分です。
Linuxのコマンドラインでは、このように細かい単位で操作を指示することが多いため、少しずつ慣れていきましょう。
5. 異なるスキップ数を指定する高度な使い方
実は、-iオプションにはさらに便利な使い方があります。それは、一つ目のファイルと二つ目のファイルで別々のスキップ数を指定する方法です。例えば「ファイルAは先頭の3文字を飛ばしたいけど、ファイルBは10文字飛ばしたい」といった特殊な状況にも対応できます。
その場合は、数字をコロン(:)で繋いで記述します。実際の例を見てみましょう。
cmp -i 3:10 file1.txt file2.txt
このコマンドの意味は、「file1.txtは3バイト飛ばし、file2.txtは10バイト飛ばした場所から比較を始めてください」という命令になります。非常に柔軟ですよね。データの形式が微妙に違う二つのファイルを比べる際に、プログラマーやシステムエンジニアがよく使うテクニックの一つです。
6. 実行例1:ヘッダー情報を無視して比較する
より具体的なイメージを持ってもらうために、実際のファイルを想定した例を紹介します。例えば、ログファイルのように先頭に必ず日付(2026-04-01のような形式)が入っている二つのファイルを想像してください。日付は違っても、その後のメッセージ内容が同じかどうかを確認したい場合があります。
日付部分が10バイト分あると仮定して、そこを無視して比較してみます。
cmp -i 10 log_a.txt log_b.txt
もしログの内容が同じであれば、日付が違っていても画面には何も表示されず、比較は成功します。これが-iオプションの便利なところです。手作業でファイルを開いて見比べるのは大変ですが、コマンドを使えば一瞬で終わります。
7. 実行例2:ルート権限でシステムファイルを比較する
Linuxには、一般のユーザーでは中身を見ることができない大切な「設定ファイル」が存在します。これらを比較する場合は、sudo(スドー)という魔法の言葉を使って、管理者(ルートユーザー)として実行する必要があります。ルート権限で実行する例を見てみましょう。
cmp -i 100 /etc/config_old /etc/config_new
/etc/config_old /etc/config_new differ: byte 150, line 10
この例では、設定ファイルの先頭100バイト(初期設定部分など)をスキップして比較しています。結果として、150バイト目(スキップした分を含めて数えた場所)に違いが見つかったことがわかります。このように、システム管理の現場でも-iオプションは大活躍します。
8. diffコマンドとの違いを知っておこう
Linuxにはファイルを比較するコマンドがもう一つあります。それがdiff(ディフ)コマンドです。初心者の方は「どっちを使えばいいの?」と迷うかもしれません。簡単に違いを整理しておきましょう。
cmpコマンドは、どちらかというと「バイナリファイル」(画像やプログラム本体など、人間が読めないデータ)の比較に向いています。どこが違うかをバイト単位で正確に教えてくれるからです。一方、diffは「テキストファイル」(人間が読める文章)の比較が得意で、行ごとに「どこが追加されて、どこが消えたか」を詳しく表示してくれます。
「とりあえず同じかどうかだけ知りたい」「特定の場所を飛ばしてチェックしたい」というシンプルな目的には、今回学習しているcmpコマンドが最適です。
9. オプション指定時の注意点
-iオプションを使う際に気をつけてほしいポイントがいくつかあります。まず、スキップするバイト数にファイル全体のサイズよりも大きな数字を指定してはいけません。中身を全部通り越して比較するものがなくなってしまうからです。
また、数字を指定するときに「1K」や「1M」といった単位を使うこともできます。Kはキロバイト(約1000バイト)、Mはメガバイト(約100万バイト)を意味します。大きなデータを扱うときに便利ですが、初心者のうちは、まずは正確な数字を直接入力する方法から慣れていくのが良いでしょう。
コマンド入力に失敗してもパソコンが壊れることはありませんので、間違えることを恐れずに、色々な数字を入れて試してみてくださいね。ターミナルでの操作は、習うより慣れろです。
10. よくあるエラーと対処法
最後に、よく遭遇するエラーについて解説します。例えば、存在しないファイル名を指定してしまった場合は、次のようなエラーが表示されます。
cmp -i 5 sample.txt test.txt
cmp: sample.txt: No such file or directory
これは「そんなファイルやディレクトリ(フォルダ)は見当たりませんよ」という意味です。ファイル名が正しいか、今自分がいる場所(カレントディレクトリ)にそのファイルがあるかを確認しましょう。また、数字を指定し忘れてcmp -i file1 file2のように入力すると、コマンドが正しく動かないので注意してください。必ず「-i」の直後には数字を入れるのがルールです。
これらの基本を押さえておけば、Linuxでのファイル操作がぐっと楽になります。少しずつコマンドの種類を増やして、自由自在にパソコンを操れるようになりましょう!
まとめ
今回の記事では、Linuxのファイル比較において非常に強力なツールであるcmpコマンドの-iオプションについて詳しく解説してきました。
初心者の方にとっては、コマンドラインでのファイル操作は一見難しく感じるかもしれませんが、cmpコマンドは「二つのファイルが同一かどうか」を素早く判定するためのシンプルかつ信頼性の高い手段です。
特に、今回焦点を当てた-iオプション(ignoreオプション)を使いこなすことで、ファイルの先頭にある不要なヘッダー情報や、実行環境ごとに異なるタイムスタンプ、メタデータなどをスマートに読み飛ばして、本当に比較したいデータ部分だけに集中してチェックを行うことが可能になります。
cmpコマンドの重要ポイント再確認
これまでに学んだ重要な知識を、SEOキーワードも交えて整理しておきましょう。
Linuxサーバーの運用や開発現場では、データの整合性を保つことが非常に重要です。
cmpコマンドはバイナリレベルでの比較を行うため、画像ファイルや圧縮ファイル、実行バイナリなどの比較にも最適です。
一方で、テキストファイルの行ごとの差異を詳しく知りたい場合はdiffコマンド、より詳細なバイナリ解析が必要な場合はhexdumpやodコマンドと組み合わせて使うなど、用途に応じた使い分けがエンジニアとしてのスキルアップに繋がります。
単一のスキップ指定:
cmp -i [バイト数] ファイル1 ファイル2
個別のスキップ指定:
cmp -i [スキップ1]:[スキップ2] ファイル1 ファイル2
- 先頭の不要なデータを無視できる
- 高速なバイナリ比較が可能
- スクリプトでの自動判定に便利
実践的な応用例:シェルスクリプトでの活用
実務では、単にコマンドを叩くだけでなく、シェルスクリプトの中でcmpコマンドの戻り値(終了ステータス)を利用することがよくあります。
cmpは、ファイルが同じなら「0」、異なれば「1」、エラーが発生すれば「2」を返します。
以下に、特定のバイト数をスキップして比較し、結果を判定する簡単なスクリプトのイメージを紹介します。
# test_compare.sh というファイルを作成して実行する例
if cmp -s -i 10 file_a.dat file_b.dat; then
echo "10バイト以降は一致しています"
else
echo "差異が見つかりました"
fi
ここで使っている-sオプションは「silent」の意味で、画面に差異の結果を出さず、終了ステータスだけを返してほしい時に使います。
自動化処理(オートメーション)を組む際には、この組み合わせが非常に便利です。
ルート権限での操作についての補足
システム全体のバックアップを確認する場合や、OSの重要な設定ファイルを比較する際には、一般ユーザーでは権限が足りないことがあります。
その場合は、記事内でも紹介したようにsudoコマンドを付与して実行します。
特に/etcディレクトリ配下のファイルを扱う際は、管理者権限が必要不可欠です。
# ルート権限で特定のオフセットから比較を行う
cmp -i 512 /dev/sda1 /dev/sdb1
このようにデバイスファイルを直接比較するような高度な操作も、cmpコマンドなら可能です。
Linuxの知識を深めることは、インフラエンジニアやシステム管理者としてのキャリア形成に大きく役立ちます。
今回の学習をきっかけに、他のファイル操作コマンド(cp, mv, rm, findなど)との連携もぜひ試してみてください。
生徒
先生、ありがとうございました!cmp -iオプションを使えば、ファイルの最初にある「おまけ」みたいなデータを無視して、中身の正体だけを比べられるんですね。
今日学んだことを振り返ると、まずは基本のcmpで全体を比較して、もし先頭が違うことが分かっているなら-iでスキップする、という流れがとてもスッキリ理解できました。
先生
その通りです!素晴らしい理解力ですね。 特に「バイト」という単位に最初は戸惑うかもしれませんが、テキストなら「1文字=1バイト」という感覚で使い始めて、徐々に慣れていけば大丈夫ですよ。 コロンを使って「3:10」のように別々のスキップ数を指定できるテクニックも覚えていますか?
生徒
はい、バッチリです!片方のファイルだけデータが少し後ろにずれているような時に、あのアジャスト機能はすごく便利そうです。
あと、ルート権限を使う時にsudoを使う理由も、システムを守るために大切なことなんだなと分かりました。
これからログファイルのチェックをする時は、手作業で目を皿のようにして探すんじゃなくて、まずはcmp -iを使ってみます!
先生
いい意気込みですね。コマンドを使いこなせると、仕事の正確性もスピードも格段に上がります。 もし実行して「No such file or directory」というエラーが出ても、落ち着いてファイル名やパス(場所)を確認すれば解決できることも学びましたね。 失敗を恐れずに、どんどんターミナルを触って自分のモノにしていってください。
生徒
ありがとうございます!「習うより慣れろ」ですね。
次は、バイナリ比較だけじゃなくて、文章の細かい違いを教えてくれるdiffコマンドについても、もっと詳しく知りたくなりました。
Linuxの世界は奥が深くて面白いです!
先生
その好奇心こそが上達の近道です。
次回はぜひ、diffコマンドの使いこなし術についても一緒に勉強しましょう。
一つずつ武器を増やしていけば、どんなトラブルにも動じない立派なLinuxユーザーになれますよ。
今日はお疲れ様でした!