Linuxでバイナリファイルを比較するならcmp!使い方と活用例を徹底解説

Linuxでは、テキストファイルだけでなくバイナリファイルの比較が求められる場面があります。たとえば、プログラムの出力ファイルが意図した通りかどうか確認したいとき、ファームウェアや画像、実行ファイルのバージョン違いを検出したいときなどです。
そんなときに役立つのが、cmpコマンドです。cmpは2つのファイルをバイト単位で比較し、どこが異なるかを正確に教えてくれる便利なツールです。この記事では、cmpの基本的な使い方から、オプションの活用法、実用的な使用例までを丁寧に解説します。


cmpコマンドとは?

cmpは、2つのファイルをバイト単位で比較するLinuxの標準コマンドです。テキストファイルだけでなく、バイナリファイルも対象にでき、非常に軽量かつ高速に動作します。

基本的な構文は以下の通りです。

cmp [オプション] ファイル1 ファイル2

ファイルの違いが見つからなければ、何も出力せず、終了ステータス0を返します。違いがあると、最初に異なるバイト位置の情報を表示してくれます。


基本的な使い方

まずは、もっともシンプルな使い方を紹介します。

例1:2つのファイルの違いを確認する

cmp fileA.bin fileB.bin

出力例:

fileA.bin fileB.bin differ: byte 103, line 5

この例では、103バイト目、5行目で差異があると表示されています。テキストファイルであれば行番号も参考になります。

例2:違いがなければ何も表示しない

cmp identical1.txt identical2.txt

出力: (何も表示されない)

終了ステータスを確認すれば違いがなかったことがわかります。

echo $?

結果:0(一致)


オプションの活用方法

cmpにはいくつか便利なオプションがあります。

-l(ロング形式)

違いがあるすべてのバイト位置とその内容を表示します。

cmp -l fileA.bin fileB.bin

出力例:

103  145  146
208 10 11

これは、103バイト目でファイルAは145、ファイルBは146という違いがあることを示します(10進数)。

-s(サイレント)

出力を抑え、終了ステータスだけで判断したいときに便利です。

cmp -s fileA.bin fileB.bin

違いがあっても何も表示されません。終了ステータスのみを確認することで一致・不一致を判断できます。

  • 一致:ステータス 0
  • 不一致:ステータス 1
  • エラー:ステータス 2

スクリプト内での条件分岐に適しています。


cmpコマンドの実用例

バイナリファイルの差異確認

ソフトウェア開発では、コンパイル結果のバイナリが前回と同じかどうかを確認するためにcmpが使われます。

cmp -s program_v1.bin program_v2.bin
if [ $? -ne 0 ]; then
echo "バイナリファイルに違いがあります"
else
echo "バイナリファイルは同一です"
fi

スクリプト内での利用例

例えば、設定ファイルを更新するスクリプトで、変更があったときのみコピーする処理も可能です。

cmp -s config.new config.current
if [ $? -ne 0 ]; then
echo "設定ファイルが変更されました。更新します。"
cp config.new config.current
fi

このように、ファイルの変更検出にcmpを活用できます。


cmpとdiffの違い

ファイルの比較にはdiffコマンドも有名ですが、用途が異なります。

コマンド主な用途出力の違い
cmpバイト単位での比較異なるバイト位置を表示
diff行単位での比較(テキスト向け)行ごとの違いを視覚的に表示

特にバイナリやコンパイルされた実行ファイルなどでは、diffではなくcmpの方が適しています。


cmpを活用したテスト自動化

テスト工程でもcmpは活躍します。出力ファイルが想定通りかどうかをチェックする際、cmp -sを使って自動判定ができます。

以下は、テストスクリプトの例です。

./run_program > output.dat
cmp -s output.dat expected_output.dat
if [ $? -ne 0 ]; then
echo "テスト失敗:出力が一致しません"
exit 1
else
echo "テスト成功:出力が一致しました"
fi

継続的インテグレーション(CI)のツールと組み合わせることで、変更の影響チェックにも活用できます。


バイナリエディタと併用して深掘り

もしcmpで差異が見つかり、その内容を詳しく調べたい場合は、xxdhexdumpといったバイナリエディタと併用するのが効果的です。

hexdump -C fileA.bin > fileA.hex
hexdump -C fileB.bin > fileB.hex
diff fileA.hex fileB.hex

この方法で、cmpでは把握できない細かい内容まで確認できます。


まとめ

cmpコマンドは、バイナリファイルを含む2つのファイルを効率的に比較できる便利なツールです。シンプルなコマンドでありながらも、オプションを活用することで柔軟な使い方ができます。
特にスクリプトでの変更検出やテスト自動化、ビルド成果物の整合性チェックなどにおいて、cmpは非常に有用です。

テキストベースのdiffとは使い分けることで、より正確で効率的なファイル比較が実現できます。Linuxユーザーであれば、ぜひ覚えておきたい基本コマンドのひとつです。

タイトルとURLをコピーしました