Linuxコマンドcmpの使い方と5つのオプション

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つのファイルが同一であれば、以下の図のように何もメッセージは出力されません。

図1. Linuxコマンドcmp: 2つのファイルが同じ場合の実行結果
図1. Linuxコマンドcmp: 2つのファイルが同じ場合の実行結果

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

図2. a.txtとb.txtファイルの内容が異なる
図2. a.txtとb.txtファイルの内容が異なる

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

図3. Linuxコマンドcmp: 2つのファイルが異なる場合の実行結果
図3. Linuxコマンドcmp: 2つのファイルが異なる場合の実行結果

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)が異なることが確認できます。

図4. Linuxコマンドcmp: -lオプションで8進数で差異を出力
図4. Linuxコマンドcmp: -lオプションで8進数で差異を出力

しかし、このように見ると通常の人は簡単に理解するのは難しいです。次のオプションを併用すると、より容易に把握できます。

-bオプション: 異なる文字を表示

-bオプションを利用すると、バイト位置だけでなく、異なる文字の8進数とその文字も表示されます。

cmp -b file1.txt file2.txt
ShellScript

しかし、以下の図のように最初に現れる異なる部分だけが表示されます。

図5. Linuxコマンドcmp: -bオプションで異なる文字を表示
図5. Linuxコマンドcmp: -bオプションで異なる文字を表示

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

図6. Linuxコマンドcmp: -bと-lオプションを併用して異なる部分の位置と文字を確認
図6. Linuxコマンドcmp: -bと-lオプションを併用して異なる部分の位置と文字を確認

-sオプション: 差異があるかどうかだけを確認

-sオプションを使用すると、cmpは2つのファイルが同一であるかどうかだけを確認し、結果を出力しません。このオプションは、単にファイルの同一性だけを確認したい場合に有効です。

cmp -s file1.txt file2.txt
ShellScript

このコマンドを実行した後、終了コードによってファイルが同一かどうかを確認できます。以下の図のように、終了コードが0であればファイルが同一であることがわかります。

図7. Linuxコマンドcmp: -sオプションで出力結果を表示しないが、終了コードで同じことを確認
図7. Linuxコマンドcmp: -sオプションで出力結果を表示しないが、終了コードで同じことを確認

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

図8. Linuxコマンドcmp: -sオプションで出力結果を表示しないが、終了コードで異なることを確認
図8. Linuxコマンドcmp: -sオプションで出力結果を表示しないが、終了コードで異なることを確認

-nオプション: 比較するバイト数を制限

-nオプションを使用すると、指定したバイト数だけファイルを比較することができます。例えば、最初の100バイトだけを比較したい場合は、次のように入力できます。

cmp -n 100 file1.txt file2.txt
ShellScript

このコマンドは、2つのファイルの最初の100バイトだけを比較し、その結果を出力します。以下の図を参照すると、3バイト目までの文字は同一であり、5バイト目の文字が異なることがわかります。

図9. Linuxコマンドcmp: -nオプションで比較終了ポイントをバイト数で制限
図9. Linuxコマンドcmp: -nオプションで比較終了ポイントをバイト数で制限

-iオプション: 比較開始位置を指定

-iオプションを使用すると、ファイルを比較する際に、指定したバイト位置から比較を開始できます。このオプションは、特定の位置以降だけを比較したい場合に有効です。

cmp -i 100 file1.txt file2.txt
ShellScript

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

図10. Linuxコマンドcmp: -iオプションで比較開始ポイントをバイト数で設定
図10. Linuxコマンドcmp: -iオプションで比較開始ポイントをバイト数で設定

cmpコマンド活用方法

大きなファイルの比較

cmpコマンドは、大きなファイルを比較する際に特に有効です。ファイルの内容が同一であるかを迅速に確認でき、差異がある場合にはその位置をすぐに知ることができます。大きなバイナリファイルやログファイルを比較する際には、性能的にも優れています。

スクリプトでの活用

cmpコマンドは終了コードを返すため、スクリプト内で2つのファイルの同一性を検査する自動化に使用できます。例えば、ファイルが同一でない場合のみ特定の作業を実行するようなスクリプトを作成することができます。

#!/bin/bash

if cmp -s a.txt b.txt; then
    echo "ファイルが同一です."
else
    echo "ファイルが異なります."
    cat b.txt
fi
ShellScript

2つのファイルが異なる場合、以下のように「ファイルが異なります。」と出力され、catコマンドの実行結果が表示されることが確認できます。

図11. Linuxコマンドcmpをスクリプトで活用した場合
図11. Linuxコマンドcmpをスクリプトで活用した場合

バイナリファイルの比較

cmpコマンドは、テキストファイルだけでなくバイナリファイルの比較にも使用されます。バイナリファイルを比較する際には、-lオプションを使用して差異をバイト単位で詳細に分析できます。

注意事項

cmpコマンドを使用する際に注意すべき点は、ファイルのサイズが非常に大きい場合、比較作業に時間がかかる可能性があることです。また、cmpは基本的に2つのファイル全体を比較するため、もしファイルの特定部分だけを比較したい場合は、-nや-iオプションを適切に活用することをお勧めします。

また、cmpコマンドは主にファイルのバイトレベルで比較を行うため、テキストファイルの改行の違い(例:WindowsとUnix間の違い)も差異として認識される可能性があります。このような場合には、diffコマンドなどのように行単位で比較を行うコマンドを使用する方が適している場合があります。

まとめ

Linuxコマンドcmpは、Linuxでファイル比較作業を行う際に非常に有用なツールです。ファイルのバイト単位の比較を通じて迅速かつ正確に差異を見つけることができ、さまざまなオプションを使用して比較範囲や結果の出力を調整することができます。特に大きなファイルやバイナリファイルを比較する際には強力な性能を発揮し、スクリプトと組み合わせて自動化作業にも利用できます。ファイル比較作業が必要な時に、Linuxコマンドcmpを適切に活用してみてください。

リファレンス

関連ポスト

コメントする