はじめに

こんにちは!今回は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
diff -r dir1 dir2

実行結果:

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

実行結果:

1
(スペースやタブの違いが無視される)

-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

実行結果:

1
(削除された行は赤、追加された行は緑で表示)

--colorオプションで差分を色付きで表示します。ターミナルで見やすくなります。


例10: パッチファイルの生成

1
diff -u original.txt modified.txt > changes.patch

実行結果:

1
(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 -udiff -qrdiff -w

diffはファイル管理の基本。設定変更の確認、バージョン管理、パッチの生成など、開発作業では毎日使うコマンドです。Git の内部でも使われている、とても重要なコマンドですよ!