Linuxコマンドcmpは、主に2つのファイルを比較して差異を確認するために使用されます。ファイルがテキストファイルであれ、バイナリファイルであれ使用でき、特に大きなファイルを比較する際に性能的に優れた結果を示します。今回の投稿では、cmpコマンドの基本的な使い方と主要なオプションについて説明し、いくつかの有用な活用方法も紹介します。
目次
Linuxコマンドcmpとは?
cmpコマンドは、Linuxで2つのファイルをバイト単位で比較し、最初に差異が発生する位置を知らせるツールです。基本的にcmpは差異が発見されるまで2つのファイルを比較し、差異がある場合、その位置と差異を出力します。もし2つのファイルが同一であれば、何も出力されずに終了し、終了コードとして0を返します。
Linuxコマンドcmp基本使用法
cmpコマンドを使用する最も簡単な方法は以下の通りです:
cmp ファイル1 ファイル2
ShellScript例えば、2つのテキストファイルfile1.txtとfile2.txtを比較するには、次のように入力します:
cmp file1.txt file2.txt
ShellScriptこの場合、もし2つのファイルが同一であれば、以下の図のように何もメッセージは出力されません。

次に、b.txtファイルを修正して、大文字のCとEを小文字のcとeに変更しました。

これで、b.txtファイルが異なるため、以下の図のように最初の差異に関する情報が出力されます。

cmpコマンドオプション
cmpコマンドには、いくつかの有用なオプションがあります。これらのオプションを活用することで、ファイル比較作業をより効果的に行うことができます。
-lオプション: 各バイトの差異を出力
-lオプションを使用すると、2つのファイルの差異をバイト単位で出力できます。このオプションは、2つのファイルが複数の箇所で異なる場合に有効です。
cmp -l file1.txt file2.txt
ShellScriptこのコマンドを実行すると、2つのファイルのバイト差異が位置とともに8進数で表示されます。例えば、5バイト目の8進数103(C)と143(c)が異なることや、9バイト目の105(E)と145(e)が異なることが確認できます。

しかし、このように見ると通常の人は簡単に理解するのは難しいです。次のオプションを併用すると、より容易に把握できます。
-bオプション: 異なる文字を表示
-bオプションを利用すると、バイト位置だけでなく、異なる文字の8進数とその文字も表示されます。
cmp -b file1.txt file2.txt
ShellScriptしかし、以下の図のように最初に現れる異なる部分だけが表示されます。

したがって、前述の-lオプションと-bオプションを一緒に使用すると、どの位置のどの文字が異なるかを明確に確認できます。

-sオプション: 差異があるかどうかだけを確認
-sオプションを使用すると、cmpは2つのファイルが同一であるかどうかだけを確認し、結果を出力しません。このオプションは、単にファイルの同一性だけを確認したい場合に有効です。
cmp -s file1.txt file2.txt
ShellScriptこのコマンドを実行した後、終了コードによってファイルが同一かどうかを確認できます。以下の図のように、終了コードが0であればファイルが同一であることがわかります。

終了コードが1であればファイルが異なることを確認できます。

-nオプション: 比較するバイト数を制限
-nオプションを使用すると、指定したバイト数だけファイルを比較することができます。例えば、最初の100バイトだけを比較したい場合は、次のように入力できます。
cmp -n 100 file1.txt file2.txt
ShellScriptこのコマンドは、2つのファイルの最初の100バイトだけを比較し、その結果を出力します。以下の図を参照すると、3バイト目までの文字は同一であり、5バイト目の文字が異なることがわかります。

-iオプション: 比較開始位置を指定
-iオプションを使用すると、ファイルを比較する際に、指定したバイト位置から比較を開始できます。このオプションは、特定の位置以降だけを比較したい場合に有効です。
cmp -i 100 file1.txt file2.txt
ShellScriptこのコマンドは、2つのファイルの100バイト目から比較を開始します。興味深いのは、指定したバイトが基準点としてずれる点です。以下の図では、8バイト目から比較した場合は位置がbyte 1と表示されますが、7バイト目から比較した場合は位置がbyte 2と表示されることが確認できます。-i値に入れる最小値は0から始まるので、-i 8というオプションを使用すると、実際には9バイト目から比較が始まります。この部分は、直接値を入力して確認してください。

cmpコマンド活用方法
大きなファイルの比較
cmpコマンドは、大きなファイルを比較する際に特に有効です。ファイルの内容が同一であるかを迅速に確認でき、差異がある場合にはその位置をすぐに知ることができます。大きなバイナリファイルやログファイルを比較する際には、性能的にも優れています。
スクリプトでの活用
cmpコマンドは終了コードを返すため、スクリプト内で2つのファイルの同一性を検査する自動化に使用できます。例えば、ファイルが同一でない場合のみ特定の作業を実行するようなスクリプトを作成することができます。
#!/bin/bash
if cmp -s a.txt b.txt; then
echo "ファイルが同一です."
else
echo "ファイルが異なります."
cat b.txt
fi
ShellScript2つのファイルが異なる場合、以下のように「ファイルが異なります。」と出力され、catコマンドの実行結果が表示されることが確認できます。

バイナリファイルの比較
cmpコマンドは、テキストファイルだけでなくバイナリファイルの比較にも使用されます。バイナリファイルを比較する際には、-lオプションを使用して差異をバイト単位で詳細に分析できます。
注意事項
cmpコマンドを使用する際に注意すべき点は、ファイルのサイズが非常に大きい場合、比較作業に時間がかかる可能性があることです。また、cmpは基本的に2つのファイル全体を比較するため、もしファイルの特定部分だけを比較したい場合は、-nや-iオプションを適切に活用することをお勧めします。
また、cmpコマンドは主にファイルのバイトレベルで比較を行うため、テキストファイルの改行の違い(例:WindowsとUnix間の違い)も差異として認識される可能性があります。このような場合には、diffコマンドなどのように行単位で比較を行うコマンドを使用する方が適している場合があります。
まとめ
Linuxコマンドcmpは、Linuxでファイル比較作業を行う際に非常に有用なツールです。ファイルのバイト単位の比較を通じて迅速かつ正確に差異を見つけることができ、さまざまなオプションを使用して比較範囲や結果の出力を調整することができます。特に大きなファイルやバイナリファイルを比較する際には強力な性能を発揮し、スクリプトと組み合わせて自動化作業にも利用できます。ファイル比較作業が必要な時に、Linuxコマンドcmpを適切に活用してみてください。