「分かりそう」で「分からない」でも「分かった」気になれるLinuxコマンド辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるLinuxコマンド辞典

cmp

スポンサーリンク

何するコマンド?

2つのファイルバイナリ単位で比較するときに使うコマンド



書き方

cmp [オプション] [ファイル1] [ファイル2] [無視するバイト数1] [無視するバイト数2]



オプション

オプション説明
-l違いのあった位置を全部表示する
-s何も表示しない。終了コードのみ返却する

補足事項

終了コードは以下の通りです。


終了コード意味
0違いは、ないよ
1違いがあるよ
2エラーが発生したよ

それでは使い方を見てみましょう。
例えば以下の2つのファイルがあったとします。

■file1.txt
abc
abc
dabc


■file2.txt
aabc
abc
eeabc


この状態で

cmp file1.txt file2.txt

を実行すると、結果は

file1.txt file2.txt differ: byte 2, line 1

に なります。
最初に違いのあった場所を表示していますね。
先頭から2バイト目(1行目)が「b」と「a」で違うので、そこが指摘されています。

■file1.txt
abc
abc
dabc


■file2.txt
aabc
abc
eeabc


次に「-l」オプションを指定して

cmp -l file1.txt file2.txt

を実行してみましょう。
結果は

 2 142 141
 3 143 142
 4  12 143
 5 141  12
 6 142 141
 7 143 142
 8  12 143
 9 144  12
10 141 145
11 142 145
12 143 141
13  12 142
cmp: EOF on file1.txt


となります。
見てもよく分かりませんが「どことどこが違うよ~」というのを細かく表示してくれているのでしょう。

次に「-s」オプションを指定して

cmp -s file1.txt file2.txt

を実行してみます。

結果は……画面上には何も表示されません。
ただし、その直後に

echo $?

を実行すると

・0(違いなし)
・1(違いあり)
・2(エラー)


のどれかが表示されます。
画面上には何も表示されませんが、実行結果は返されているのです。
「-s」オプションは何かプログラムの中で「cmp」コマンドを使うとき用のオプションですね。

最後に、無視するバイト数を指定してみましょう。
ファイル名の後に数字を指定することで、先頭から何バイト読み飛ばすか指定できます。
例えば

cmp file1.txt file2.txt 0 1

を指定すると「file1.txt」の先頭0バイトと「file2.txt」の先頭1バイトを読み飛ばして比較します。
つまり「file1.txt」の1バイト目からと「file2.txt」の2バイト目からを比較してくれるのです。

■file1.txt
abc
abc
dabc


■file2.txt
aabc
abc
eeabc


の状態で

cmp file1.txt file2.txt 0 1

を実行すると、結果は

file1.txt file2.txt differ: byte 9, line 3

に なります。
「file2.txt」は2バイト目からの比較なので「file1.txt」と「file2.txt」の1行目は一致します。

■file1.txt
abc
abc
dabc


■file2.txt
aabc
abc
eeabc


2行目も普通に一致します。
3行目になって、やっと違いが出てくるのです。

スポンサーリンク


書籍画像