diffコマンドとは?Linuxでファイル差分を比較する方法

  • URLをコピーしました!

Linuxではdiffコマンドを使うことで、2つのファイルの差分を確認できます。

例えば以下のような用途で利用されます。

・設定ファイルの差分確認
・ソースコード変更点の確認
・バックアップ比較

本記事では以下を解説します。

・diffコマンドとは
・ファイル差分の確認方法
・代表的なオプション

📌 他のLinuxコマンドもまとめて確認したい方へ
ファイル操作・検索・テキスト処理など用途別に整理した総合まとめはこちら。
Linuxコマンド総まとめ

目次

目次

diffコマンドとは(できること)

diff は差分確認の定番で、主に次の用途で使います。

  • 設定ファイル:変更前後の差分確認(障害調査・変更作業の検証)
  • コード:修正点の確認(レビュー/品質チェック)
  • ディレクトリ:配布物やバックアップの差分検証
  • パッチ作成:差分をファイル化して配布/適用(unified diff)

構文(ファイル/ディレクトリ)

ファイル比較

diff [オプション] ファイル1 ファイル2

ディレクトリ比較(再帰)

diff -r [オプション] ディレクトリ1 ディレクトリ2

※ ディレクトリ比較は「どのファイルが違うか」を見たいケースが多いので、後述の -q(概要表示)や除外オプションと組み合わせると実務で強いです。

差分出力の読み方(ここが重要)

1) 通常形式(例:3c3 / a / d)

diff file1.txt file2.txt

出力例:

3c3
< Hello World
---
> Hello Linux
  • 3c3:3行目が変更(change)
  • <:左(file1.txt)の内容
  • >:右(file2.txt)の内容

他にも、追加(add)は a、削除(delete)は d として表示されます。通常形式は短く見えますが、パッチ用途には向きません。

2) unified形式(-u:Gitでも見慣れた形式)

diff -u file1.txt file2.txt

出力例(抜粋):

--- file1.txt
+++ file2.txt
@@ -1,3 +1,3 @@
 Line 1
 Line 2
-Hello World
+Hello Linux
  • ---:変更前ファイル
  • +++:変更後ファイル
  • @@ -1,3 +1,3 @@:変更範囲(行番号/行数)の目印
  • -:削除された行、+:追加された行

unified形式は patch で適用しやすいため、実務では -u が第一候補になります。

よく使うオプション一覧(実務向け)

オプション用途ポイント
-uunified形式レビュー/パッチ作成の基本
-ccontext形式古い運用で見かけることもある
-rディレクトリ再帰比較配布物/バックアップ検証に必須
-q違うかどうかだけ大量差分の「まず全体把握」に強い
-s同一ファイルも表示検証ログに「同じ」も残したい時
-y左右並列表示短い差分の目視比較に強い
--suppress-common-lines同一行を非表示-y と併用で見やすい
-i大文字/小文字を無視ホスト名/環境差分のノイズ除去
-w空白差分を無視インデント差分が邪魔な時の定番
-b連続空白差分を無視スペース数の違いだけを潰したい時
-B空行の違いを無視ログ/設定の整形差分に強い
--strip-trailing-cr行末CRを無視Windows由来CRLFの差分ノイズ対策
--color=auto色付けターミナル出力時だけ色を付ける
--exclude=PATTERN除外-r 時にログ/キャッシュ等を除外

使用例(実務でそのまま使える)

1) 設定ファイルの差分(まずはunified)

diff -u /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2) インデント/空白の差分が邪魔(-w/-B)

diff -u -w -B before.conf after.conf

3) ディレクトリ比較(まずは違いがあるファイルだけ把握)

diff -rq /etc/app_v1 /etc/app_v2

4) ディレクトリ比較(不要ファイルを除外して精度UP)

diff -r --exclude="*.log" --exclude="*.tmp" dir1 dir2

5) 左右並列で見たい(目視最強)

diff -y --suppress-common-lines file1.txt file2.txt

差分をパッチ化して適用する(diff → patch)

1) パッチ作成(unified形式が基本)

diff -u original.conf modified.conf > changes.patch

2) パッチ適用

patch < changes.patch

3) 戻したい(ロールバック)

patch -R < changes.patch

※ ディレクトリ構造を含むパッチでは -p1 / -p0 の指定が必要になることがあります(パスの何階層を落とすか)。

事故りやすいポイント(空白・改行・CRLF)

空白・インデント差分が大量に出る

  • インデントが原因なら -w(空白無視)
  • 空行が原因なら -B

Windows由来のCRLFで差分が出る

  • --strip-trailing-cr を使い、行末CRの差分ノイズを潰す

差分が巨大すぎて見づらい

  • まず -rq で「違うファイルだけ」洗い出す
  • 見る対象を絞ってから -u-y に切り替える

FAQ

Q1. diff と cmp の使い分けは?
ざっくり「どこが違うか」を見たいなら diff、バイナリ含めて「同じか違うか」を早く判断したいなら cmp が向きます(Diffutilsには diff/cmp/sdiff/diff3 があります)。

Q2. Gitを使っていなくても -u を使うべき?
はい。-u は差分の前後文脈が入り、レビューや patch 適用に向くため、実務の第一候補です。

Q3. ディレクトリ差分で「まず全体把握」するには?
diff -rq dir1 dir2 が最短です。差分ファイルが特定できたら、個別に diff -u で中身を確認してください。

まとめ

diff は「差分を見る」だけでなく、unified(-u)でパッチ化し、変更を安全に配布・適用・ロールバックできるのが強みです。まずは -u、大量比較は -rq、目視は -y を軸に運用すると、実務がかなり楽になります。

目次