ファイルの差分有無だけを知りたい

diffコマンドは差分箇所を出力するが、シェルスクリプトなどで差分の有無だけを判定したい場合、差分箇所の出力は不要である。-qオプションを付けると、差分箇所を出力せず「ファイルが異なるかどうか」のみを終了コードで返す。

$ echo apple > a.txt
$ echo apple > b.txt
$ diff -q a.txt b.txt
$ echo $?
0

内容が同じファイルを比較すると、出力は何もなく終了コードは0である。

$ echo banana > c.txt
$ diff -q a.txt c.txt
Files a.txt and c.txt differ
$ echo $?
1

内容が異なる場合はFiles a.txt and c.txt differという1行のみを出力し、終了コードは1になる。-qを付けた場合、通常のdiffで表示される差分箇所は出力されない。

if文で差分の有無を判定する

終了コードのみを使う場合、Files ... differという出力も不要である。標準出力を/dev/nullに捨て、if文で終了コードを判定する。

$ if diff -q a.txt b.txt > /dev/null; then
>   echo "同じ"
> else
>   echo "異なる"
> fi
同じ

$ if diff -q a.txt c.txt > /dev/null; then
>   echo "同じ"
> else
>   echo "異なる"
> fi
異なる

ファイルが存在しない場合は終了コードが2になり、if文ではelse側に分岐する。差分がない場合の0、差分がある場合の1、エラーの場合の2を区別したい場合はif文ではなく$?を直接確認する。

$ diff -q a.txt nofile.txt > /dev/null 2>&1
$ echo $?
2