## はじめに
「設定ファイルを変更前と変更後で何が違うのか確認したい」「2つのサーバーの`/etc`配下を比較したい」——こうしたシーンで活躍するのが`diff`コマンドです。テキストファイルの差分を出力する基本コマンドで、patchコマンドと組み合わせれば差分の適用までシームレスに行えます。
diffにはいくつかの出力形式があり、最もよく使われるのは`-u`オプションのunified diff形式です。これはGitなどのバージョン管理システムで採用されている読みやすい形式で、`+`が追加行、`-`が削除行、`@@`が位置情報を表します。
本記事では、diffの基本から実用的な使い方までを整理します。
## 症状・背景
– 設定ファイルの変更履歴を行単位で把握したい
– 2台のサーバーの設定を比較し、差異を洗い出したい
– 自作スクリプトと配布スクリプトの違いを確認したい
– patchファイルを作って別環境に変更を適用したい
## 手順・設定方法
### ステップ1: 基本のdiff出力形式
3つの代表的フォーマットを使い分けます。
“`bash
# デフォルト(normal形式)
diff old.conf new.conf
# unified形式(推奨、Gitと同じ)
diff -u old.conf new.conf
# 文脈付き(context形式)
diff -c old.conf new.conf
# 並列表示(人間が見やすい)
diff -y old.conf new.conf
# 並列表示の幅指定
diff -y -W 160 old.conf new.conf
“`
### ステップ2: ディレクトリ比較
複数ファイルをまとめて比較します。
“`bash
# 2つのディレクトリを再帰的に比較
diff -r dir1/ dir2/
# 差分があったファイル名のみ表示
diff -rq dir1/ dir2/
# 共通ファイルも表示
diff -rs dir1/ dir2/
# 隠しファイルを無視
diff -r –exclude=”.*” dir1/ dir2/
# 特定パターンを除外
diff -r –exclude=”*.log” –exclude=”cache” dir1/ dir2/
“`
### ステップ3: 表示の絞り込みと無視オプション
ノイズを減らして本質的な差分だけを見ます。
“`bash
# 空白を無視
diff -w old.conf new.conf
# 行末の空白だけ無視
diff -b old.conf new.conf
# 空行を無視
diff -B old.conf new.conf
# 大文字小文字を区別しない
diff -i old.conf new.conf
# 全部組み合わせ
diff -uwbB old.conf new.conf
“`
### ステップ4: patchファイルの生成と活用
変更を別環境に適用する流れです。
“`bash
# unified形式でパッチファイルを生成
diff -u original.conf modified.conf > my-changes.patch
# 内容を確認
cat my-changes.patch
# 別環境で適用(patch記事を参照)
patch original.conf < my-changes.patch
# ディレクトリレベルのパッチ
diff -urN dir1/ dir2/ > directory.patch
# .gitignore的に除外しつつパッチ作成
diff -urN –exclude=”.git” –exclude=”*.log” \
dir1/ dir2/ > clean.patch
“`
## 注意事項
– バイナリファイルの差分は意味不明な出力になる、`-q`オプションでファイル名のみ表示推奨
– 改行コードの違い(CRLF vs LF)で全行差分扱いされることがある、`dos2unix`で前処理
– ファイルが大きすぎる場合は事前にgrepで関心領域を絞ってから比較
– patchで適用するためには必ず`-u`または`-c`オプションで生成する
## まとめ
1. **推奨形式**: `diff -u` のunified形式が読みやすく汎用的
2. **ディレクトリ**: `diff -rq` で差分ファイル名一覧
3. **ノイズ除去**: `-w` で空白、`-B` で空行を無視
4. **patch生成**: `diff -u` の出力をリダイレクトすれば即パッチ
5. **並列表示**: `diff -y` で人間に優しいビュー
関連記事:
– [patchコマンドでファイルにパッチを適用する方法](/articles/linux-patch-command/)
– [vimdiffで対話的に差分を編集する方法](/articles/linux-vimdiff/)
– [colordiffでカラフルな差分表示を行う方法](/articles/linux-colordiff/)







