【完全リファレンス】Linuxでファイルの差分を確認する方法|diff・colordiff・vimdiff完全ガイド

  • 作成日 2026.06.26
  • linux
【完全リファレンス】Linuxでファイルの差分を確認する方法|diff・colordiff・vimdiff完全ガイド

サーバー運用・コード管理・設定ファイルメンテナンスで頻繁に必要となる「2つのファイルの差分確認」:

# 設定ファイルのバックアップとの比較
diff /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 環境ごとの比較
diff config/development.rb config/production.rb

# ディレクトリ全体の比較
diff -r ./project_old ./project_new

Linux には差分確認のための強力なツールが3つあります:

  • diff – 標準コマンド、複数の出力形式
  • colordiff – 差分を色付きで見やすく
  • vimdiff – Vim でインタラクティブに編集・比較

しかし、実務では:

  • diff の出力が読みづらい
  • -c-u の違いは?
  • colordiff をインストールしたが上手く色が出ない
  • vimdiff のキー操作が分からない(dp / do って何?)
  • ディレクトリ全体を比較したい
  • パッチを作成したい
  • 空白の差を無視したい
  • 大量の差分から特定の変更だけ見たい

など、躓くポイントが多くあります。

本記事では、Linux でファイル差分を確認する方法を、diff / colordiff / vimdiff の3大ツールを中心にリファレンスとして完全網羅します。基本コマンド、各種出力形式、主要オプション、色付け、Vim でのインタラクティブ操作、ディレクトリ比較、パッチファイル作成、実践パターン、トラブルシューティング、FAQまで完全網羅。この1本でLinux の差分確認をマスターできます。


目次

結論:今すぐ使える基本パターン10選

時間がない方向けに、頻出パターンを先に示します。

# ① 基本(標準形式)
diff file1.txt file2.txt

# ② unified形式(最もよく使う)
diff -u file1.txt file2.txt

# ③ 色付きで表示(diff標準)
diff --color=auto file1.txt file2.txt

# ④ 並べて表示(side-by-side)
diff -y file1.txt file2.txt

# ⑤ ディレクトリ全体を再帰比較
diff -r dir1/ dir2/

# ⑥ 簡易表示(差分の有無のみ)
diff -q file1.txt file2.txt

# ⑦ 空白・大文字小文字無視
diff -w -i file1.txt file2.txt

# ⑧ colordiff で色付き
colordiff -u file1.txt file2.txt

# ⑨ vimdiff でインタラクティブ
vimdiff file1.txt file2.txt

# ⑩ パッチファイル作成
diff -u file1.txt file2.txt > changes.patch

詳細は以下で順に解説します。


diff コマンドの基本

diff とは

diff は POSIX 標準のファイル比較コマンド。ほぼすべての Linux/Unix 系 OS にプリインストール。

基本構文

diff [オプション] file1 file2

何も差分がない場合

diff identical1.txt identical2.txt
# 出力なし(exit code 0)

echo $? で結果確認:

  • 0: 差分なし
  • 1: 差分あり
  • 2: エラー

簡単な例

ファイル1(file1.txt):

apple
banana
cherry
date

ファイル2(file2.txt):

apple
blueberry
cherry
elderberry
diff file1.txt file2.txt

出力:

2c2
< banana
---
> blueberry
4c4
< date
---
> elderberry

意味:

  • 2c2: ファイル1の2行目とファイル2の2行目が変更(change)されている
  • <: ファイル1の内容
  • >: ファイル2の内容
  • ---: 区切り

標準形式の記号

記号意味
<1つ目のファイルの行(左側)
>2つ目のファイルの行(右側)
c変更(change)
a追加(add)
d削除(delete)
1,3c1,2ファイル1の1-3行とファイル2の1-2行が変更

行番号の読み方

2,4c2,5

→ ファイル1の2〜4行が、ファイル2の2〜5行に変更されている。

3a4,5

→ ファイル1の3行目の後に、ファイル2の4〜5行が追加。

5,7d6

→ ファイル1の5〜7行が、ファイル2の6行目の位置で削除。


diff の出力形式

標準形式(normal)

何も指定しない場合のデフォルト。前述の通り c/a/d 記号を使う。

diff file1.txt file2.txt

Unified 形式(-u、最もよく使う)

diff -u file1.txt file2.txt

出力例:

--- file1.txt   2026-06-20 10:00:00.000000000 +0900
+++ file2.txt   2026-06-20 10:05:00.000000000 +0900
@@ -1,4 +1,4 @@
 apple
-banana
+blueberry
 cherry
-date
+elderberry

意味:

  • --- file1.txt: 元ファイル
  • +++ file2.txt: 比較対象
  • @@ -1,4 +1,4 @@: ファイル1の1行目から4行分、ファイル2の1行目から4行分
  • -: 削除された行
  • +: 追加された行
  • (スペース始まり): 変更なしの行(コンテキスト)

-u は patch ファイルの標準形式。Git/Mercurial/SVN もこの形式を使う。

Unified の前後コンテキスト

# 前後3行をコンテキストとして表示(デフォルト)
diff -u file1.txt file2.txt

# 前後5行に変更
diff -U 5 file1.txt file2.txt

Context 形式(-c、古い形式)

diff -c file1.txt file2.txt

出力例:

*** file1.txt   2026-06-20 10:00:00
--- file2.txt   2026-06-20 10:05:00
***************
*** 1,4 ****
  apple
! banana
  cherry
! date
--- 1,4 ----
  apple
! blueberry
  cherry
! elderberry

意味:

  • ***: 元ファイル
  • ---: 比較対象
  • !: 変更された行

現代ではほぼ -u を使う。古いツールとの互換性目的のみ。

Side-by-side 形式(-y)

diff -y file1.txt file2.txt

出力例:

apple                       apple
banana                    | blueberry
cherry                      cherry
date                      | elderberry

意味:

  • |: 変更
  • <: ファイル1のみ
  • >: ファイル2のみ
  • 空白: 同じ

目視で比較する時に最も見やすい。ターミナル幅が広い時に効果的。

Side-by-side の幅指定

# デフォルトは端末幅
diff -y -W 200 file1.txt file2.txt
# 200文字幅で表示

同じ行を省略

diff -y --suppress-common-lines file1.txt file2.txt

差分のある行のみ表示。

Brief 形式(-q)

diff -q file1.txt file2.txt

出力:

Files file1.txt and file2.txt differ

差分の有無のみ確認。スクリプトで判定に使う:

if diff -q file1.txt file2.txt > /dev/null; then
  echo "同一"
else
  echo "差分あり"
fi

同一の場合に表示

diff -s file1.txt file2.txt

差分がない場合:

Files file1.txt and file2.txt are identical

通常 diff は差分がないと出力なしですが、-s で明示的に「同じ」と表示。


重要なオプション

大文字小文字を無視(-i)

diff -i file1.txt file2.txt

例:

file1: Hello
file2: HELLO

-i 付きなら差分なし扱い。

空白を無視

# 空白の量を無視
diff -w file1.txt file2.txt

# 行末・行頭の空白を無視
diff -b file1.txt file2.txt

# すべての空白を無視
diff -w file1.txt file2.txt

# 空行を無視
diff -B file1.txt file2.txt

例:

file1: hello world
file2: hello   world    (複数空白)

-w で差分なし扱い。

複数オプション組み合わせ

# Unified + 大文字小文字無視 + 空白無視 + 色付き
diff -u -i -w --color=auto file1.txt file2.txt

バイナリファイルの扱い

# バイナリファイルかチェック
diff file1.bin file2.bin
# Binary files file1.bin and file2.bin differ

# テキストとして扱う
diff -a file1.bin file2.bin

–color オプション(diff 標準の色付け)

GNU diff 3.4以降で対応:

diff --color file1.txt file2.txt
diff --color=auto file1.txt file2.txt
diff --color=always file1.txt file2.txt | less -R
diff --color=never file1.txt file2.txt

カラー設定:

  • auto: 端末出力時のみ色付け(デフォルト推奨)
  • always: 常に色付け(パイプ経由でも)
  • never: 色を使わない

colordiff を使わなくても、diff --color で十分なケースが多い。


ディレクトリの比較

基本

diff dir1/ dir2/
Only in dir1/: extra_file.txt
Only in dir2/: new_file.txt
diff dir1/common_file.txt dir2/common_file.txt
1c1
< old content
---
> new content

再帰的に比較(-r)

diff -r dir1/ dir2/

サブディレクトリも含めて比較。

同じファイルも表示(-s)

diff -r -s dir1/ dir2/
Files dir1/file_a.txt and dir2/file_a.txt are identical
Files dir1/file_b.txt and dir2/file_b.txt are identical
diff dir1/file_c.txt dir2/file_c.txt
...

ファイル名のみ(-q)

diff -q -r dir1/ dir2/

差分内容ではなく、どのファイルが違うかだけを表示。

特定パターンを除外(–exclude)

# .git ディレクトリを除外
diff -r --exclude=.git dir1/ dir2/

# 複数除外
diff -r --exclude=.git --exclude=node_modules --exclude='*.log' dir1/ dir2/

exclude-from でファイル指定

# exclude_patterns.txt に除外パターンを書く
cat > exclude_patterns.txt <<EOF
.git
node_modules
*.log
*.tmp
EOF

diff -r --exclude-from=exclude_patterns.txt dir1/ dir2/

実用例:プロジェクトのバージョン比較

# 旧バージョンと新バージョンのソース差分
diff -r -u --exclude=.git --exclude=tmp \
     project_v1.0/ project_v1.1/ > changes.patch

詳細はLinux find オプション一覧の記事Linux awk 使い方の記事も参照。


colordiff の使い方

colordiff とは

diff の出力を色付きで見やすく表示するラッパーツール。Perl で書かれている。

インストール

# Ubuntu/Debian
sudo apt install colordiff

# RHEL/CentOS/Rocky/AlmaLinux
sudo dnf install colordiff
# または
sudo yum install colordiff

# macOS(Homebrew)
brew install colordiff

基本的な使い方

# diff と同じ引数
colordiff file1.txt file2.txt

# Unified 形式(推奨)
colordiff -u file1.txt file2.txt

# パイプ経由
diff file1.txt file2.txt | colordiff

less で見る(色を保持)

# -R オプションで色を保持
colordiff -u file1.txt file2.txt | less -R

-R でANSI エスケープシーケンスを処理。これがないと色が文字化けする。

設定ファイル

# システム全体: /etc/colordiffrc
# ユーザー個別: ~/.colordiffrc

サンプル ~/.colordiffrc:

banner=no
color_patches=yes
plain=off

newtext=darkgreen
oldtext=darkred
diffstuff=darkcyan
cvsstuff=darkblue

色名: black, red, green, yellow, blue, magenta, cyan, whitedark* バージョンもあり。

git diff の色との連動

# git diff 風の色設定例
cat > ~/.colordiffrc <<EOF
newtext=green
oldtext=red
diffstuff=cyan
EOF

colordiff vs diff –color

# どちらでも色付き表示
diff --color=auto -u file1.txt file2.txt
colordiff -u file1.txt file2.txt
観点diff --colorcolordiff
追加インストール不要(diff 3.4+)必要
設定ファイルなし~/.colordiffrc
カスタマイズ性限定的高い
パイプ対応--color=always標準対応

新しい環境では diff --color で十分。細かいカスタマイズが必要なら colordiff

alias 登録

# ~/.bashrc または ~/.zshrc
alias diff='colordiff'
# または
alias diff='diff --color=auto'

これで diff だけで色付きに。


vimdiff の使い方

vimdiff とは

Vim ベースのインタラクティブな差分表示・編集ツール。Vim がインストールされていれば使える。

起動

vimdiff file1.txt file2.txt

または:

vim -d file1.txt file2.txt

画面の見方

┌─────────────────┬─────────────────┐
│ file1.txt       │ file2.txt       │
├─────────────────┼─────────────────┤
│ apple           │ apple           │
│ banana          │ blueberry       │  ← 異なる行はハイライト
│ cherry          │ cherry          │
│ date            │ elderberry      │  ← 同上
└─────────────────┴─────────────────┘
  • 左右に分割(垂直):デフォルト
  • 異なる行:色付きハイライト
  • 同じ行:折りたたまれることも

3つ以上のファイル

vimdiff file1.txt file2.txt file3.txt

最大 8ファイルまで対応。

ナビゲーション(最重要)

キー動作
]c次の差分へ
[c前の差分へ
Ctrl+w h左のウィンドウへ
Ctrl+w l右のウィンドウへ
Ctrl+w w次のウィンドウへ
Ctrl+w Ctrl+w同上

差分の取り込み(重要)

vimdiff の真価:

キー動作
dpdiff put: 現在の差分を反対側にコピー
dodiff obtain: 反対側の差分をこちらに取り込み

例:

  • file1 を見ながら ]c で差分位置へ
  • dp で「file1 の内容を file2 へコピー」
  • do で「file2 の内容を file1 に取り込み」

これでインタラクティブにマージできます。

折りたたみの操作

差分のない箇所は折りたたまれて表示:

キー動作
zo折りたたみを開く
zc折りたたむ
zr全体の折りたたみレベルを下げる
zM全部折りたたむ
zR全部開く

レイアウト変更

# 水平分割(上下)
vimdiff -o file1.txt file2.txt

または、起動後に:

:set diffopt+=horizontal

保存と終了

キー動作
:w現在のウィンドウを保存
:wa全部保存
:q現在のウィンドウを閉じる
:qa全ウィンドウ閉じる
:qa!強制終了(変更破棄)

diff モードの ON/OFF

:diffoff
" 差分モード解除(通常のVimに戻る)

:diffthis
" 現在のバッファを差分モードに

:diffupdate
" 差分を再計算

vim 内で diff を開く

:vert diffsplit file2.txt
" 縦分割で差分表示

:diffsplit file2.txt
" 横分割で差分表示

gvim での vimdiff

gvimdiff file1.txt file2.txt

GUI 版。色がより見やすい場合があります。

vimdiff の色設定

" .vimrc に追加
highlight DiffAdd    cterm=bold ctermbg=22 gui=none guibg=#005f00
highlight DiffDelete cterm=bold ctermbg=52 gui=none guibg=#5f0000
highlight DiffChange cterm=bold ctermbg=24 gui=none guibg=#005f5f
highlight DiffText   cterm=bold ctermbg=88 gui=none guibg=#870000

その他の差分ツール

sdiff(side-by-side diff)

sdiff file1.txt file2.txt

diff -y と似た出力ですが、マージモードもあります:

sdiff -o merged.txt file1.txt file2.txt
# インタラクティブにマージ

選択肢:

  • l: left(file1)を採用
  • r: right(file2)を採用
  • e: edit(手動編集)
  • q: quit

wdiff(word diff)

sudo apt install wdiff   # インストール
wdiff file1.txt file2.txt

単語単位で差分を表示:

The quick [-brown-] {+red+} fox jumps over the lazy dog
  • [-...-]: 削除
  • {+...+}: 追加

git diff

git 管理下では:

git diff file.txt              # ワーキングツリー vs インデックス
git diff --staged file.txt     # インデックス vs HEAD
git diff HEAD                   # ワーキングツリー vs HEAD
git diff branch1 branch2 -- file.txt   # ブランチ間

# 単語単位
git diff --word-diff file.txt

# git管理外のファイルでもgit diffが使える
git diff --no-index file1.txt file2.txt

色付け・パッチ出力が完成度高く、開発作業では git diff を使うことが多い。

meld(GUI ツール)

sudo apt install meld

meld file1.txt file2.txt
meld dir1/ dir2/

GUI で最もユーザーフレンドリーな差分表示。デスクトップ環境で作業する時に。

kompare(KDE)

sudo apt install kompare

kompare file1.txt file2.txt

KDE 環境での GUI 差分ツール。


パッチファイルの作成と適用

パッチファイル作成

diff -u original.txt modified.txt > my_changes.patch

または複数ファイル:

diff -urN original_dir/ modified_dir/ > my_changes.patch

オプション:

  • -u: unified形式
  • -r: 再帰
  • -N: 新規ファイル含む

パッチ適用

patch -p0 < my_changes.patch
# または
patch -p1 < my_changes.patch

-p の数字はパスの省略レベル:

  • -p0: パス変更なし
  • -p1: 先頭1階層を省略

パッチの dry-run

patch --dry-run -p1 < my_changes.patch
# 実際には適用しないで確認

パッチのロールバック

patch -R -p1 < my_changes.patch
# Reverse: 適用済みパッチを取り消し

実践パターン

1. 設定ファイルのバックアップ比較

# 編集前にバックアップ
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 編集後に確認
diff -u /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf
# または色付き
diff --color=auto -u /etc/nginx/nginx.conf.bak /etc/nginx/nginx.conf

2. プロジェクトのバージョン比較

# 古いバージョンと新しいバージョン
diff -r -u --exclude=.git --exclude=node_modules \
     v1.0/ v1.1/ > version_changes.diff

3. 設定の環境差分

# 開発・本番の設定差分
diff -u config/development.rb config/production.rb

4. ログファイルの差分

# 1分前と現在のログを比較
diff -u log/production.log.1 log/production.log

Linux awk 使い方の記事と組み合わせて高度な解析:

diff <(awk '{print $1}' file1.log) <(awk '{print $1}' file2.log)

5. 大量のファイルから差分のあるものだけ抽出

# 名前のみ表示
diff -q -r dir1/ dir2/ | grep "^Files" | cut -d' ' -f2

# 特定ファイルだけ詳細表示
for f in $(diff -q -r dir1/ dir2/ | grep "^Files" | cut -d' ' -f2); do
  echo "=== $f ==="
  diff -u "$f" "${f/dir1/dir2}"
done

6. 設定ファイルの diff を共有

# パッチ作成 → メンバーに送信
diff -u nginx.conf.old nginx.conf > nginx_update.patch

# 受け取った側で適用
patch nginx.conf < nginx_update.patch

7. 巨大ファイルの効率比較

# 最初の100行だけ
diff <(head -100 large_file1.log) <(head -100 large_file2.log)

# ハッシュで一致確認
md5sum file1 file2
# 違うことだけ確認できれば十分なケース

8. 行末改行コードの違い

# CRLF vs LF
file file1.txt file2.txt
# file1.txt: ASCII text, with CRLF line terminators
# file2.txt: ASCII text

# 改行コード変換
dos2unix file1.txt

ありがちなトラブル

less で色が見えない

diff --color=auto file1 file2 | less
# 色が消える!

# 解決:less -R
diff --color=always file1 file2 | less -R

--color=always + less -R の組み合わせ。

改行コードの違いで全行差分

diff file_lf.txt file_crlf.txt
# 全行に差分マーク

# 改行コードを統一
sed -i 's/\r$//' file_crlf.txt

または:

diff <(tr -d '\r' < file_lf.txt) <(tr -d '\r' < file_crlf.txt)

diff の出力が見づらい

# 標準形式 → unified
diff -u file1 file2

# unified → 色付き
diff -u --color=auto file1 file2

# 色付き → vimdiff(インタラクティブ)
vimdiff file1 file2

段階的に強化。

大量の差分でターミナルが埋まる

# less でページング
diff -u file1 file2 | less

# またはファイル出力
diff -u file1 file2 > diff_output.txt

バイナリファイル

diff file1.png file2.png
# Binary files file1.png and file2.png differ

# テキストとして強制
diff -a file1.png file2.png
# ただし読めない出力に

# 専用ツール
cmp file1.png file2.png
# 最初の違いのみ報告

vimdiff でファイルが折りたたまれて見えない

:set foldlevel=99
" すべて開く

zR
" 同上

vim内のシンタックスハイライトと衝突

:syntax off
" シンタックスハイライト無効化
:syntax on
" 戻す

diff の他コマンドとの連携

grep と組み合わせ

# 特定パターンを含む差分行のみ
diff -u file1 file2 | grep "^[+-]" | grep "error"

詳細はLinux grep オプション一覧の記事も参照。

find と組み合わせ

# 1日以内に変更されたファイルだけ比較
find . -mtime -1 -name "*.conf" | while read f; do
  diff -u "$f.bak" "$f"
done

詳細はLinux find オプション一覧の記事も参照。

crontab で定期実行

# 毎日設定ファイルの変更を確認
crontab -e
0 9 * * * diff -u /etc/nginx/nginx.conf.yesterday /etc/nginx/nginx.conf > /tmp/nginx_changes.log 2>&1

詳細はcrontab 書き方 例の記事も参照。

awk と組み合わせ

# 追加行(+)のみ抽出
diff -u file1 file2 | awk '/^\+[^+]/'

# 削除行(-)のみ抽出
diff -u file1 file2 | awk '/^-[^-]/'

詳細はLinux awk 使い方の記事も参照。


よくある質問(FAQ)

Q1. diff と cmp の違いは?

ツール用途出力
diff行単位の差分表示詳細な差分
cmpバイト単位の比較最初の違いの位置のみ
# テキスト → diff
diff file1.txt file2.txt

# バイナリ → cmp
cmp file1.bin file2.bin

Q2. diff -u と diff -c どちらを使う?

**-u(unified)**を使う。-c(context)は古い形式で、現在ほぼ使わない。

Q3. 大文字小文字を無視したい

diff -i file1.txt file2.txt

Q4. 空白の違いを無視したい

# 空白量を無視
diff -w file1.txt file2.txt

# タブとスペースの混在を無視
diff -E file1.txt file2.txt

# 全空白無視
diff -w -E -b file1.txt file2.txt

Q5. colordiff と diff –color どちらが良い?

新しい diff(3.4+)が入っていれば diff --color で十分。古い環境や細かいカスタマイズが必要なら colordiff。

Q6. vimdiff の dp/do を覚えるコツ

  • dp: diff put(押し出す、相手に送る)
  • do: diff obtain(取得、相手から取り込む)

文字通り p = put, o = obtain

Q7. パッチで失敗した

patch -p1 < changes.patch
# 一部失敗

# 失敗箇所は .rej ファイルに保存される
ls *.rej
# nginx.conf.rej

.rej を確認して手動で適用。

Q8. ディレクトリの構造だけ比較

# ファイル名だけ
diff <(cd dir1 && find . -type f | sort) <(cd dir2 && find . -type f | sort)

Q9. 巨大ファイルで差分計算が遅い

# 単純な差分判定だけなら md5
md5sum file1 file2
# ハッシュが違えば内容も違う

# または cmp(最初の違いで止まる)
cmp file1 file2

Q10. WebでBeautifulな差分

# diff2html
npm install -g diff2html-cli

diff -u file1 file2 | diff2html -i stdin
# ブラウザで HTML 表示

Q11. 設定ファイルの行末スペースで困る

# 表示
cat -A file1
# 行末や特殊文字が見える

# 行末スペース削除
sed -i 's/[ \t]*$//' file1

Q12. patch コマンドの -p オプション

diff -ru a/path/to/file b/path/to/file

path/to/file を対象にしたい場合:

patch -p1 < changes.patch
# 1階層省略(a/, b/)

参考リンク・関連資料

公式

関連ツール

  • meld – GUI 差分ツール
  • diff2html – HTML 差分
  • delta – モダンなdiff ビューア(Rust製)

関連記事(本サイト)


まとめ

Linux でファイル差分を確認する3大ツール、要点を再整理します。

diff の使い分け

シーン推奨オプション
一般的な比較diff -u
色付き表示diff --color=auto -u
並べて表示diff -y
ディレクトリdiff -r -u
同一確認のみdiff -q
空白無視diff -w
パッチ作成diff -u -r

colordiff

  • diff の出力を色付け
  • ~/.colordiffrc でカスタマイズ
  • 新しい diff には --color があるので必須ではない

vimdiff

  • インタラクティブな差分編集
  • ]c / [c でナビゲーション
  • dp / do で差分の取り込み
  • マージ作業に最適

その他のツール

  • sdiff: side-by-side + マージモード
  • wdiff: 単語単位の差分
  • git diff: バージョン管理下の差分
  • meld / kompare: GUI ツール
  • cmp: バイナリの簡易比較

パッチファイル

diff -u old new > changes.patch
patch -p1 < changes.patch    # 適用
patch -R -p1 < changes.patch # 取り消し

これらの知識は、サーバー運用・設定管理・コードレビュー・バックアップ確認など、Linux 環境のあらゆる場面で活用できます。本記事をブックマークしておけば、差分確認の作業を大幅に効率化できます。


本記事は2026年6月時点の情報をもとに、GNU diffutils 3.10+、colordiff 1.0.20+、Vim 9.x での動作確認・公式ドキュメントに基づき作成しています。ディストリビューションによって挙動が異なる場合があるため、最新の情報は各ツールの man ページ(man diffman colordiffman vimdiff)もあわせてご確認ください。