ファイル操作 初級

diffとpatchでファイルの差分を管理する

diffコマンドでファイルの差分を確認し、patchコマンドで差分を適用する方法を学ぶ。コードレビューやバックアップ管理に役立つ実践的な使い方を解説する。

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.txtmodified.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.txt

diff の出力が空であれば、ふたつのファイルの内容が一致しています。

問題3

-R オプションを使って、問題2で適用したパッチを取り消し、v1.txt を元の内容に戻してください。

答えを見る
patch -R v1.txt < update.patch

これで v1.txt が元の「Linux is an operating system.」に戻ります。cat v1.txt で確認してみましょう。