はじめに#
こんにちは!今回はdiffコマンドについて解説します。
diffは2つのファイルの差分(違い)を表示するコマンドです。“difference"の略ですね。
設定ファイルを編集する前後で何が変わったのか確認したい、複数のバージョンのファイルを比較したい、そんな時に活躍します。プログラマーやシステム管理者にとって、ファイル管理の基本ツールですよ。
diffコマンドとは#
diffは、2つのファイルやディレクトリを比較し、その差分を表示する外部コマンドです。
どの行が削除され、どの行が追加されたのかを明確に表示します。ファイルのバージョン管理、設定変更の追跡、パッチファイルの生成など、ソフトウェア開発では欠かせないコマンドです。
主な用途:
- 2つのファイルの差分表示
- 設定ファイルの変更確認
- ディレクトリ間の差分確認
- パッチファイルの生成
基本構文#
1
|
diff [オプション] ファイル1 ファイル2
|
2つのファイルを指定して、差分を表示します。ディレクトリも指定可能です。
主なオプション#
| オプション |
説明 |
-u |
ユニファイド形式で表示(最も読みやすい) |
-c |
コンテキスト形式で表示 |
-b |
行末の空白の違いを無視 |
-w |
すべての空白を無視 |
-i |
大文字・小文字の違いを無視 |
-r |
ディレクトリを再帰的に比較 |
-q |
差分の有無のみ表示 |
-y |
サイドバイサイド形式で表示 |
--color |
色付き表示 |
使用例#
例1: 基本的な差分表示#
1
|
diff file1.txt file2.txt
|
実行結果:
1
2
3
4
5
6
|
1c1
< Hello World
---
> Hello Linux
3a4
> Welcome
|
デフォルト形式で差分を表示します。<は最初のファイル、>は2番目のファイルの内容です。
例2: ユニファイド形式で表示(推奨)#
1
|
diff -u file1.txt file2.txt
|
実行結果:
1
2
3
4
5
6
7
8
|
--- file1.txt 2026-01-03 10:00:00.000000000 +0900
+++ file2.txt 2026-01-03 10:30:00.000000000 +0900
@@ -1,3 +1,4 @@
-Hello World
+Hello Linux
Good morning
Have a nice day
+Welcome
|
-uオプションで最も読みやすいユニファイド形式で表示します。GitやPatchで使われるデフォルト形式です。
例3: 差分の有無のみ表示#
1
|
diff -q file1.txt file2.txt
|
実行結果:
1
|
Files file1.txt and file2.txt differ
|
-qオプションで、差分があるかないかだけを表示します。大量のファイル比較に便利です。
例4: ディレクトリを再帰的に比較#
実行結果:
1
2
|
Only in dir2: newfile.txt
Files dir1/config.txt and dir2/config.txt differ
|
-rオプションでディレクトリ配下のすべてのファイルを比較します。
例5: 空白の違いを無視#
1
|
diff -b file1.txt file2.txt
|
実行結果:
1
|
(行末の空白の違いだけなら、差分は表示されない)
|
-bオプションで、行末の空白の違いを無視して比較します。
例6: すべての空白を無視#
1
|
diff -w file1.txt file2.txt
|
実行結果:
-wオプションで、すべての空白(スペース、タブ、改行)の違いを無視します。
例7: 大文字・小文字を無視#
1
|
diff -i file1.txt file2.txt
|
実行結果:
1
|
(Hello と hello の違いは無視される)
|
-iオプションで、大文字・小文字の違いを無視して比較します。
例8: サイドバイサイド形式で表示#
1
|
diff -y file1.txt file2.txt
|
実行結果:
1
2
3
4
|
Hello World | Hello Linux
Good morning Good morning
Have a nice day Have a nice day
> Welcome
|
-yオプションで、2つのファイルを左右に並べて表示します。視覚的に比較しやすいです。
例9: 色付き表示#
1
|
diff --color file1.txt file2.txt
|
実行結果:
--colorオプションで差分を色付きで表示します。ターミナルで見やすくなります。
例10: パッチファイルの生成#
1
|
diff -u original.txt modified.txt > changes.patch
|
実行結果:
ユニファイド形式の出力をファイルに保存してパッチファイルを作成できます。
Tips・注意点#
diffコマンドの出力形式について#
1
2
3
4
5
6
7
8
9
10
11
|
# デフォルト形式の読み方
1c1 # 1行目で変更(c=change)
< 古い内容
--- # 区切り線
> 新しい内容
3a4 # 3行目の後に4行目を追加(a=add)
> 追加された内容
5d6 # 5行目を削除(d=delete)
< 削除された内容
|
出力の最初の数字で、どこがどのように異なるかが分かります。
ファイルが同じかどうかの確認#
1
2
3
4
5
6
7
8
9
|
# 差分がない場合は何も出力されない
diff file1.txt file2.txt
# 終了コードで判定
if diff -q file1.txt file2.txt > /dev/null 2>&1; then
echo "ファイルは同じです"
else
echo "ファイルが異なります"
fi
|
終了コード($?)でファイルが同じかどうかを判定できます。
patchコマンドとの組み合わせ#
1
2
3
4
5
6
7
8
|
# パッチを生成
diff -u original.txt modified.txt > changes.patch
# パッチを適用
patch original.txt < changes.patch
# パッチの内容確認
cat changes.patch
|
diffで生成したパッチをpatchコマンドで適用できます。
バイナリファイルの比較#
1
2
3
4
5
6
|
# バイナリファイルは差分表示できない
diff binary1.bin binary2.bin
Binary files binary1.bin and binary2.bin differ
# バイナリファイル比較には cmp を使用
cmp -l binary1.bin binary2.bin
|
テキストファイルとは異なり、バイナリファイルの詳細な差分表示はできません。
大きなファイル比較の性能問題#
1
2
3
4
5
|
# 大量のファイル比較は時間がかかる可能性
time diff -r large_dir1 large_dir2
# 差分があるかだけを知りたい場合は -q で高速化
time diff -qr large_dir1 large_dir2
|
ディレクトリ比較では-qオプションで高速化できます。
実践的な使い方#
設定ファイル変更の確認#
1
2
3
4
5
|
# 設定ファイルを編集する前にバックアップ
cp /etc/config.conf /etc/config.conf.backup
# 編集後に差分を確認
diff -u /etc/config.conf.backup /etc/config.conf
|
設定ファイル編集時に、何が変わったかを明確にできます。
Git風のパッチ作成#
1
2
3
4
5
6
7
8
9
|
#!/bin/bash
# 修正前後のファイルからパッチを生成
diff -u old_version.py new_version.py > fix.patch
# パッチの内容確認
cat fix.patch
# パッチが正しいか検証
patch --dry-run old_version.py < fix.patch
|
バージョン管理の前にパッチを確認できます。
ディレクトリのバージョン管理#
1
2
3
4
5
|
# プロジェクトAとプロジェクトBの差分を確認
diff -ur projectA/ projectB/
# 特定の拡張子のファイルのみ比較
diff -u <(find projectA -name "*.py" | sort) <(find projectB -name "*.py" | sort)
|
複雑なディレクトリ構造の差分確認も可能です。
スクリプトの実行前チェック#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/bin/bash
# 設定を変更する前に差分を確認させる
TEMP=$(mktemp)
cat > $TEMP << 'EOF'
# 新しい設定内容
EOF
echo "変更内容:"
diff -u config.conf $TEMP
read -p "このように変更します。よろしいですか? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
cp $TEMP config.conf
fi
rm $TEMP
|
ユーザーに変更内容を確認してから適用できます。
複数バージョンの比較#
1
2
3
4
5
|
# バージョン履歴から最新と前バージョンを比較
diff -u backup/script_v1.sh backup/script_v2.sh
# ユニファイド形式で整形してファイルに保存
diff -u backup/script_v1.sh backup/script_v2.sh > changelog.diff
|
バージョン管理で変更内容を追跡できます。
まとめ#
diffコマンドのポイント:
- 基本形式:
diff ファイル1 ファイル2
- ユニファイド形式:
diff -u(最も推奨)
- 差分のみ確認:
diff -q
- ディレクトリ比較:
diff -r
- 空白無視:
diff -w
- サイドバイサイド表示:
diff -y
- パッチ生成:
diff -u > file.patch
- よく使う組み合わせ:
diff -u、diff -qr、diff -w
diffはファイル管理の基本。設定変更の確認、バージョン管理、パッチの生成など、開発作業では毎日使うコマンドです。Git の内部でも使われている、とても重要なコマンドですよ!