Linuxではdiffコマンドを使うことで、2つのファイルの差分を確認できます。
例えば以下のような用途で利用されます。
・設定ファイルの差分確認
・ソースコード変更点の確認
・バックアップ比較
本記事では以下を解説します。
・diffコマンドとは
・ファイル差分の確認方法
・代表的なオプション
📌 他のLinuxコマンドもまとめて確認したい方へ
ファイル操作・検索・テキスト処理など用途別に整理した総合まとめはこちら。
▶ Linuxコマンド総まとめ
目次
- diffコマンドとは(できること)
- 構文(ファイル/ディレクトリ)
- 差分出力の読み方(通常形式 / unified)
- よく使うオプション一覧(実務向け)
- 使用例(設定/ログ/ディレクトリ比較)
- 差分をパッチ化して適用する(diff → patch)
- 事故りやすいポイント(空白・改行・CRLF)
- FAQ
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 が第一候補になります。
よく使うオプション一覧(実務向け)
| オプション | 用途 | ポイント |
|---|---|---|
-u | unified形式 | レビュー/パッチ作成の基本 |
-c | context形式 | 古い運用で見かけることもある |
-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 を軸に運用すると、実務がかなり楽になります。


