diff入門|2つのファイルの違いを行単位で見つける基本

diff入門|2つのファイルの違いを行単位で見つける基本

設定ファイルを書き換えたあと、「どこを変えたんだっけ」と手が止まることがあります。

バックアップは残っているのに、目視で見比べても差分が見つからない。

こういうときに一発で答えを出してくれるのが diff です。

この記事では、diff の出力の読み方と、実務で使うオプションを整理します。

diff は何を出しているのか

diff は2つのファイルを行単位で比較して、片方にしか無い行だけを並べるコマンドです。

同じ行はまとめて省略されるので、出力に現れる行はすべて「変わった場所か、その周辺」。

ファイル全体を目で追う作業が、数行のチェックに縮むわけです。

まずは -u だけ覚える

出力形式はいくつかありますが、実務で使うのは -u(unified 形式)のほぼ一択。

Git のログや GitHub の差分表示もこの形なので、読めるようになると応用が広い。

$ diff -u before.txt after.txt
--- before.txt   2026-07-28 09:00:00.000000000 +0900
+++ after.txt    2026-07-28 09:05:00.000000000 +0900
@@ -1,4 +1,4 @@
 common line
-old line
+new line
 tail line

先頭2行が「どのファイルを比べたか」のヘッダになっています。

— が比較元、+++ が比較先。

hunk の読み方

@@ で挟まれた行は hunk(ハンク)と呼ばれ、差分のかたまりが本文のどこにあるかを示します。

@@ -1,4 +1,4 @@ なら、比較元の1行目から4行分と、比較先の1行目から4行分が対応しているという意味。

その下に続く行の先頭1文字が、そのまま差分の種類を表します。

(先頭の1文字が意味を持つ)

" "(半角スペース) … 両方にある行(文脈として表示)
"-"              … 比較元にだけあった行
"+"              … 比較先にだけあった行

文脈として表示される行数は、指定しなければ前後3行が既定値です(GNU diffutils マニュアル)。

広く見たいときは -U 10 のように行数を渡せばいい。

現場で効く4つのオプション

-u に添えて使う頻度が高いのは、この4つでした。

-r   ディレクトリごと再帰的に比較する
-q   中身は出さず「違うかどうか」だけ報告する
-w   空白の違いをすべて無視する
-y   2つのファイルを左右に並べて表示する

とくに -r と -q の組み合わせは、デプロイ前後のディレクトリ比較で重宝します。

$ diff -rq dirA dirB
Files dirA/config.yml and dirB/config.yml differ
Only in dirB: new.txt

インデントをタブからスペースへ直したあとの確認なら、-w で空白差を殺すと本質的な変更だけが残る。

-y は横に並ぶぶん幅を食うので、既定では130桁分の出力になります。

終了ステータスでスクリプトに組み込む

diff がありがたいのは、結果を終了ステータスで返してくれるところです。

0 なら差分なし、1 なら差分あり、2 ならエラー。

diff -q a.txt b.txt > /dev/null
case $? in
  0) echo "差分なし" ;;
  1) echo "差分あり" ;;
  *) echo "エラー" ;;
esac

この分岐を使えば、「設定ファイルが書き換わっていたら通知する」といった監視スクリプトが数行で書けます。

0 と 1 を「成功・失敗」と読み違えると逆の挙動になるので、そこだけ注意。

最後に

diff は -u で読み方さえ掴めば、あとはオプションを足していくだけの素直なコマンドでした。

grep で場所を絞り、sed で直し、diff で確かめる。

この3つが揃うと、テキストファイルまわりの作業がぐっと速くなります。

grep入門|ファイルから必要な行だけを検索・抽出する基本
sed入門|テキストを置換・抽出・削除する基本

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA