cmpコマンドで2つのファイルを比較する方法|バイト単位の差分確認とスクリプト活用


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ディレクトリ・ファイル操作 > cmpコマンドで2つのファイルを比較する方法|バイト単位の差分確認とスクリプト活用
「2つのファイルが同じ内容かどうか確認したい」
「cmpコマンドとdiffコマンドの違いがよくわからない」
Linuxで2つのファイルを比較するコマンドとして、cmp(compare)があります。
diff が行単位の差分を表示するのに対し、cmp はバイト単位で比較し、最初に異なる箇所だけを簡潔に報告します。

この記事では、cmpコマンドの基本的な使い方と実務での使いどころを解説します。

【この記事でわかること】
・cmpコマンドでファイルの同一性を確認する方法
・差分があった場合にバイト位置と行番号を確認する方法
・-l・-sオプションの使い方
・cmpとdiffの違いと使い分け方

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

cmpコマンドとは

cmp(compare)コマンドは、2つのファイルをバイト単位で比較するコマンドです。
ファイルが同一の場合は何も表示せずに終了し、差異がある場合は最初に異なるバイト位置と行番号を表示します。

diff コマンドとの違いは次の通りです。

cmp:バイト単位の比較。最初の差異のみ報告。シェルスクリプトでの同一確認に向いている
diff:行単位の比較。すべての差異を編集コマンド形式で表示。テキストファイルの差分確認に向いている

基本的な使い方

1. 2つのファイルを比較する(基本)

# ファイルを準備して比較 $ cat country_list1.txt Japan Afghanistan Algeria $ cat country_list2.txt Japan1 Afghanistan Algeria # cmpで比較 $ cmp country_list1.txt country_list2.txt country_list1.txt country_list2.txt differ: byte 6, line 1

differ: byte 6, line 1 は「1行目の6バイト目から異なる」という意味です。

2. ファイルが同一の場合

ファイルが完全に同一の場合、cmpは何も出力せずに終了します(終了コードは0)。

$ cp country_list1.txt country_list_copy.txt $ cmp country_list1.txt country_list_copy.txt # (何も表示されない = 同一) $ echo "終了コード: $?" 終了コード: 0

応用・実務Tips

1. -lオプションですべての差異を表示する

デフォルトでは最初の差異のみ表示しますが、-l オプションを付けるとすべての異なるバイトを表示します。

$ cmp -l country_list1.txt country_list2.txt 6 012 061 # バイト位置(10進) ファイル1の値(8進) ファイル2の値(8進)

012(8進)= 改行文字、061(8進)= 数字の「1」です。

2. -sオプションでサイレントモード(スクリプト向け)

-s(silent)オプションを付けると、出力を一切表示せずに終了コードのみで結果を返します。
シェルスクリプトでファイルの同一性チェックをする場合に便利です。

#!/bin/bash # バックアップファイルとオリジナルが一致しているか確認 if cmp -s original.conf backup.conf; then echo "ファイルは同一です" else echo "ファイルが異なります" fi

cmp -s の終了コード:
・0 = ファイルは同一
・1 = ファイルが異なる
・2 = エラー(ファイルが存在しない等)

3. バイナリファイルの比較

cmp はテキストだけでなくバイナリファイルの比較にも使えます。
イメージファイルや実行ファイルの整合性確認に活用できます。

# バイナリファイルを比較 $ cmp -s /usr/bin/bash /usr/bin/bash $ echo "$?" 0 # 異なるバイナリファイルの比較 $ cmp /bin/ls /bin/cat /bin/ls /bin/cat differ: byte 16, line 1

cmpとdiffの使い分け

比較コマンド 特徴 向いている場面
cmp バイト単位・最初の差異のみ・バイナリ対応 同一性チェック・バイナリ比較・スクリプト
diff 行単位・すべての差分表示・パッチ作成 設定ファイルの差分確認・コードレビュー
diff -q 同一かどうかのみ報告 テキストファイルの同一性チェック

本記事のまとめ

やりたいこと コマンド
2つのファイルを比較する cmp ファイル1 ファイル2
すべての差異をバイト単位で表示 cmp -l ファイル1 ファイル2
スクリプトで同一性チェック cmp -s ファイル1 ファイル2 && echo "同一"
バイナリファイルを比較 cmp バイナリ1 バイナリ2
終了コードを確認 echo $?(0=同一、1=差異あり)

Linuxのファイル比較・管理コマンドを体系的に学びませんか?

cmpやdiffのような比較コマンドは、設定ファイルの管理やバックアップの整合性確認など、サーバー運用の現場で頻繁に使います。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。