「cmpコマンドとdiffコマンドの違いがよくわからない」
Linuxで2つのファイルを比較するコマンドとして、
cmp(compare)があります。diff が行単位の差分を表示するのに対し、cmp はバイト単位で比較し、最初に異なる箇所だけを簡潔に報告します。この記事では、cmpコマンドの基本的な使い方と実務での使いどころを解説します。
・cmpコマンドでファイルの同一性を確認する方法
・差分があった場合にバイト位置と行番号を確認する方法
・-l・-sオプションの使い方
・cmpとdiffの違いと使い分け方
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
cmpコマンドとは
cmp(compare)コマンドは、2つのファイルをバイト単位で比較するコマンドです。ファイルが同一の場合は何も表示せずに終了し、差異がある場合は最初に異なるバイト位置と行番号を表示します。
diff コマンドとの違いは次の通りです。・cmp:バイト単位の比較。最初の差異のみ報告。シェルスクリプトでの同一確認に向いている
・diff:行単位の比較。すべての差異を編集コマンド形式で表示。テキストファイルの差分確認に向いている
基本的な使い方
1. 2つのファイルを比較する(基本)
# ファイルを準備して比較 $ cat country_list1.txt Japan Afghanistan Algeria $ cat country_list2.txt Japan1 Afghanistan Algeria # cmpで比較 $ cmp country_list1.txt country_list2.txt country_list1.txt country_list2.txt differ: byte 6, line 1
differ: byte 6, line 1 は「1行目の6バイト目から異なる」という意味です。2. ファイルが同一の場合
ファイルが完全に同一の場合、cmpは何も出力せずに終了します(終了コードは0)。$ cp country_list1.txt country_list_copy.txt $ cmp country_list1.txt country_list_copy.txt # (何も表示されない = 同一) $ echo "終了コード: $?" 終了コード: 0
応用・実務Tips
1. -lオプションですべての差異を表示する
デフォルトでは最初の差異のみ表示しますが、-l オプションを付けるとすべての異なるバイトを表示します。$ cmp -l country_list1.txt country_list2.txt 6 012 061 # バイト位置(10進) ファイル1の値(8進) ファイル2の値(8進)
012(8進)= 改行文字、061(8進)= 数字の「1」です。2. -sオプションでサイレントモード(スクリプト向け)
-s(silent)オプションを付けると、出力を一切表示せずに終了コードのみで結果を返します。シェルスクリプトでファイルの同一性チェックをする場合に便利です。
#!/bin/bash # バックアップファイルとオリジナルが一致しているか確認 if cmp -s original.conf backup.conf; then echo "ファイルは同一です" else echo "ファイルが異なります" fi
cmp -s の終了コード:・0 = ファイルは同一
・1 = ファイルが異なる
・2 = エラー(ファイルが存在しない等)
3. バイナリファイルの比較
cmp はテキストだけでなくバイナリファイルの比較にも使えます。イメージファイルや実行ファイルの整合性確認に活用できます。
# バイナリファイルを比較 $ cmp -s /usr/bin/bash /usr/bin/bash $ echo "$?" 0 # 異なるバイナリファイルの比較 $ cmp /bin/ls /bin/cat /bin/ls /bin/cat differ: byte 16, line 1
cmpとdiffの使い分け
| 比較コマンド | 特徴 | 向いている場面 |
|---|---|---|
cmp |
バイト単位・最初の差異のみ・バイナリ対応 | 同一性チェック・バイナリ比較・スクリプト |
diff |
行単位・すべての差分表示・パッチ作成 | 設定ファイルの差分確認・コードレビュー |
diff -q |
同一かどうかのみ報告 | テキストファイルの同一性チェック |
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 2つのファイルを比較する | cmp ファイル1 ファイル2 |
| すべての差異をバイト単位で表示 | cmp -l ファイル1 ファイル2 |
| スクリプトで同一性チェック | cmp -s ファイル1 ファイル2 && echo "同一" |
| バイナリファイルを比較 | cmp バイナリ1 バイナリ2 |
| 終了コードを確認 | echo $?(0=同一、1=差異あり) |
Linuxのファイル比較・管理コマンドを体系的に学びませんか?
cmpやdiffのような比較コマンドは、設定ファイルの管理やバックアップの整合性確認など、サーバー運用の現場で頻繁に使います。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
