🤗

差分の有無だけを確認するならcmpコマンドを使おう

に公開2

2つのファイルに差分があるかないかで条件を分けたいときは結構あります。 その時にcmpコマンドが便利でした。

cmpコマンド

cmpは単純に2つのファイルを比較し、それが同一かどうかを判断するコマンドです。
https://kazmax.zpp.jp/cmd/c/cmp.1.html
diffは差分を表示することが主目的であることに対して、 cmpは差分があるかないかの確認が主目的です。 よって、差分があることが判明したところで処理が終了します。

大きなファイルを対象とした場合、 diffでは先頭付近で差分があっても最後まで処理が続いてしまいます。

diff a b | head -1

のように1行でも差分が見つかったところで処理を終了させる方法はありますが、 cmpを使った方がより直接的に目的を達成できます。

少なくともmacではデフォルトでインストール済み

macOSでは/usr/bin/cmpにデフォルトでインストールされていました。

if文での分岐での利用例

2つのファイルに差分があるかないかで条件を分岐させるシェルスクリプトはこうなります。

if cmp -s a b; then
    #ファイルが同一の時の処理
else
    #ファイルが異なる時の処理
fi

-sオプションをつけると一切出力が出ず、終了コードだけを用いることができます。 終了コードは

  • 0: 2ファイルが同一である
  • 1: 2ファイルに違いがある

となっているようです。

まとめ

ファイルの変更有無で処理を分けたい場合cmpコマンドが有効であることがわかりました。 これまでhead -1のようにすぐに終わらせる処理を自分で書いて頑張ってきましたが、 こんな便利なコマンドまで用意されているんですね。

以上、誰かの参考になれば幸いです。

GitHubで編集を提案

Discussion

kanaruskanarus

macOSでは/usr/bin/dmp

/usr/bin/cmp ですかね (?)

shogetoshishogetoshi

ご指摘ありがとうございます!修正しました!