diff コマンドはふたつのファイルやディレクトリの違いを表示するツールです。
patch コマンドはその差分(パッチファイル)を別のファイルに適用するツールです。
ソースコードの変更確認・バックアップとの比較・設定ファイルの管理など、日常的な場面で活躍します。
diff の基本
2つのファイルを比較する
diff ファイル1 ファイル2
たとえば、次のような2つのファイルを用意します。
# original.txt を作成
cat > original.txt << 'EOF'
apple
banana
cherry
EOF
# modified.txt を作成
cat > modified.txt << 'EOF'
apple
blueberry
cherry
grape
EOF
diff を実行すると差分が表示されます。
diff original.txt modified.txt
出力例:
2c2
< banana
---
> blueberry
3a4
> grape
出力の読み方
| 記号 | 意味 |
|---|---|
< | ファイル1にのみ存在する行 |
> | ファイル2にのみ存在する行 |
c | 変更(change) |
a | 追加(add) |
d | 削除(delete) |
ユニファイド形式(-u オプション)
git diff でおなじみの見やすい形式で出力するには -u オプションを使います。
diff -u original.txt modified.txt
出力例:
--- original.txt 2026-08-14 10:00:00.000000000 +0900
+++ modified.txt 2026-08-14 10:01:00.000000000 +0900
@@ -1,3 +1,4 @@
apple
-banana
+blueberry
cherry
+grape
| 記号 | 意味 |
|---|---|
- | 削除された行 |
+ | 追加された行 |
(スペース) | 変更なしのコンテキスト行 |
パッチファイルの作成
差分をファイルに保存しておくと、あとで他の環境に適用できます。
diff -u original.txt modified.txt > changes.patch
changes.patch の中身を確認してみましょう。
cat changes.patch
patch コマンドで差分を適用する
基本的な使い方
patch < changes.patch
または
patch original.txt < changes.patch
patch コマンドは original.txt を modified.txt と同じ内容に書き換えます。
適用を確認する(—dry-run)
実際に変更を加える前に、適用できるかどうか確認できます。
patch --dry-run original.txt < changes.patch
エラーがなければ実際に適用しても安全です。
元に戻す(-R オプション)
パッチを逆方向に適用して、変更を取り消せます。
patch -R original.txt < changes.patch
ディレクトリ全体を比較する
-r(再帰)オプションでディレクトリ内のファイルをまとめて比較できます。
diff -ur dir1/ dir2/
変更されたファイル名だけ確認したい場合は -q を組み合わせます。
diff -rq dir1/ dir2/
よく使うオプションまとめ
| オプション | 説明 |
|---|---|
-u | ユニファイド形式(前後3行のコンテキスト付き) |
-r | ディレクトリを再帰的に比較 |
-q | 違いがあるファイル名のみ表示 |
-i | 大文字・小文字を無視 |
-w | 空白の違いを無視 |
-B | 空行の違いを無視 |
実践例:設定ファイルのバックアップと差分確認
# 設定ファイルをバックアップ
cp /etc/hosts /tmp/hosts.bak
# 設定を変更したあと差分を確認
diff /tmp/hosts.bak /etc/hosts
# パッチとして保存しておく
diff -u /tmp/hosts.bak /etc/hosts > /tmp/hosts.patch
練習問題
問題1
以下の2つのファイルを作成し、diff -u で差分を表示してください。
v1.txt:
Linux is an operating system.
It is open source.
Many distributions exist.
v2.txt:
Linux is a kernel.
It is open source.
Many distributions exist.
Users around the world use it.
答えを見る
cat > v1.txt << 'EOF'
Linux is an operating system.
It is open source.
Many distributions exist.
EOF
cat > v2.txt << 'EOF'
Linux is a kernel.
It is open source.
Many distributions exist.
Users around the world use it.
EOF
diff -u v1.txt v2.txt出力:
--- v1.txt 2026-08-14 10:00:00.000000000 +0900
+++ v2.txt 2026-08-14 10:00:00.000000000 +0900
@@ -1,3 +1,4 @@
-Linux is an operating system.
+Linux is a kernel.
It is open source.
Many distributions exist.
+Users around the world use it.問題2
問題1で作成したファイルの差分をパッチファイル(update.patch)として保存し、v1.txt に適用して v2.txt と同じ内容にしてください。その後、diff でふたつのファイルが同一になったことを確認してください。
答えを見る
# パッチファイルを作成
diff -u v1.txt v2.txt > update.patch
# v1.txt にパッチを適用
patch v1.txt < update.patch
# 差分がなくなっていることを確認(出力がなければ同一)
diff v1.txt v2.txtdiff の出力が空であれば、ふたつのファイルの内容が一致しています。
問題3
-R オプションを使って、問題2で適用したパッチを取り消し、v1.txt を元の内容に戻してください。
答えを見る
patch -R v1.txt < update.patchこれで v1.txt が元の「Linux is an operating system.」に戻ります。cat v1.txt で確認してみましょう。