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
で差異が見つかり、その内容を詳しく調べたい場合は、xxd
やhexdump
といったバイナリエディタと併用するのが効果的です。
hexdump -C fileA.bin > fileA.hex
hexdump -C fileB.bin > fileB.hex
diff fileA.hex fileB.hex
この方法で、cmp
では把握できない細かい内容まで確認できます。
まとめ
cmp
コマンドは、バイナリファイルを含む2つのファイルを効率的に比較できる便利なツールです。シンプルなコマンドでありながらも、オプションを活用することで柔軟な使い方ができます。
特にスクリプトでの変更検出やテスト自動化、ビルド成果物の整合性チェックなどにおいて、cmp
は非常に有用です。
テキストベースのdiff
とは使い分けることで、より正確で効率的なファイル比較が実現できます。Linuxユーザーであれば、ぜひ覚えておきたい基本コマンドのひとつです。