cmp
何するコマンド?
書き方
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行目になって、やっと違いが出てくるのです。
