「本番サーバーにデプロイする前に、設定ファイルの差分を確認したい」
Linuxでサーバーを管理していると、設定ファイルの変更箇所を正確に把握する場面が頻繁にあります。
この記事では、diffコマンドの基本から、実務で最も使われるunified形式(-u)やディレクトリ比較(-r)、パッチの作成・適用まで、現場で必要な使い方をすべて解説します。動作確認環境は RHEL 9.4 / Rocky Linux 9.4 です。
この記事のポイント
・diff ファイル1 ファイル2 で2つのファイルの差分を表示できる
・diff -u で unified 形式の見やすい差分出力が得られる
・diff -r でディレクトリ同士を再帰的に比較できる
・patchコマンドと組み合わせて差分を適用できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
diffコマンドとは?ファイルの差分を比較するコマンド
diffコマンドは、2つのファイルを比較して「どこが違うか」を表示するコマンドです。サーバー管理の現場では、設定ファイルの変更箇所を確認したり、バックアップとの差分をチェックしたりする場面で日常的に使います。
基本の書式は以下の通りです。
# diffコマンドの基本書式 diff [オプション] ファイル1 ファイル2
差分がなければ何も出力されず、差分があればその箇所だけが表示されます。終了コードも重要で、差分なしなら
0、差分ありなら 1、エラーなら 2 が返ります。シェルスクリプトで「ファイルが同一かどうか」を判定する場面でも活用できます。※
diff の引数は「変更前のファイルを先に、変更後のファイルを後に」指定してください。順番を逆にすると + と - の意味が逆転し、「何が追加されて何が削除されたのか」を誤読する原因になります。diff出力の読み方(<と>の意味)
diffコマンドをオプションなしで実行すると、以下のような出力になります。# 2つのファイルを比較 diff file1.txt file2.txt # 出力例 2c2 < ServerName old.example.com --- > ServerName new.example.com
・< (小なり):ファイル1にだけある行(削除された行)
・> (大なり):ファイル2にだけある行(追加された行)
・2c2:ファイル1の2行目が、ファイル2の2行目に「変更(change)」されたという意味
・---:ファイル1側とファイル2側の区切り線
変更の種類を示す記号は3つあります。
・c(change):行が変更された
・a(add):行が追加された
・d(delete):行が削除された
差分がない場合は何も出力されません。ファイルが同一であることを明示的に確認したい場合は、後述の -s オプションを使います。
基本的な使い方(よく使うオプション)
1. -s オプション:ファイルが同一か確認する
diffは差分がないときは何も出力しません。「本当に同じかどうか」を確認したいときは -s オプションを使います。# ファイルが同一か確認 diff -s file1.txt file2.txt # 同一の場合の出力 Files file1.txt and file2.txt are identical
2. -u オプション:unified形式で差分を表示する(実務で最重要)
実務で最もよく使われるのが -u オプション(unified形式)です。変更箇所の前後の文脈も一緒に表示されるので、差分が格段に読みやすくなります。# unified形式で差分を表示 diff -u file1.txt file2.txt # 出力例 --- file1.txt 2025-01-15 10:00:00.000000000 +0900 +++ file2.txt 2025-01-15 10:30:00.000000000 +0900 @@ -1,3 +1,3 @@ ServerRoot "/etc/httpd" -ServerName old.example.com +ServerName new.example.com Listen 80
・--- ファイル1:変更前のファイル(基準)
・+++ ファイル2:変更後のファイル
・@@ -1,3 +1,3 @@:変更箇所の位置情報(ファイル1の1行目から3行、ファイル2の1行目から3行)
・-(マイナス):削除された行
・+(プラス):追加された行
・(空白で始まる行):変更なしの行(文脈として表示)
unified形式はパッチファイルの作成にも使われる標準的な形式です。GitHubのプルリクエスト画面でも、この形式がベースになっています。
デフォルトでは変更箇所の前後3行が文脈として表示されます。前後の行数を変更するには、
-U の後に行数を指定します。# 前後5行の文脈を表示する diff -U5 httpd.conf.bak httpd.conf # 前後0行(変更行だけ表示) diff -U0 httpd.conf.bak httpd.conf
3. -i オプション:大文字・小文字を無視して比較する
大文字と小文字の違いを無視して比較したいときに使います。# 大文字・小文字を無視して比較 diff -i file1.txt file2.txt
4. -w / -b オプション:空白の違いを無視して比較する
スペースやタブの違いを無視して、内容の変更だけを確認したいときに使います。# すべての空白の違いを無視する diff -w file1.txt file2.txt # 空白の量の違いだけを無視する(有無の違いは検出する) diff -b file1.txt file2.txt
-w はすべての空白(スペース・タブ)の違いを完全に無視します。-b は「スペースが1個か3個か」の違いは無視しますが、「スペースがある・ない」の違いは検出します。設定ファイルのインデント修正で差分が大量に出る場合に -w が重宝します。5. -y オプション:横並び(サイドバイサイド)で比較する
2つのファイルを左右に並べて比較できます。視覚的にどこが違うかを把握しやすいのが特徴です。# 横並びで比較 diff -y file1.txt file2.txt # 出力例 ServerRoot "/etc/httpd" ServerRoot "/etc/httpd" ServerName old.example.com | ServerName new.example.com Listen 80 Listen 80 # 変更がある行だけを表示する diff -y --suppress-common-lines file1.txt file2.txt
・<(小なり):ファイル1にだけある行
・>(大なり):ファイル2にだけある行
ターミナルの横幅が狭いと見づらくなるので、-W オプションで表示幅を指定するとよいでしょう。
--suppress-common-lines を付けると変更がある行だけが表示されるので、差分だけに集中したいときに便利です。# 表示幅を120文字に指定 diff -y -W 120 file1.txt file2.txt
6. --color オプション:色付きで差分を表示する(RHEL8以降)
RHEL8/CentOS Stream 8以降のdiffコマンドでは、--color オプションで差分を色付き表示できます。# 色付きで差分を表示 diff --color file1.txt file2.txt # unified形式と組み合わせると特に見やすい diff -u --color file1.txt file2.txt
7. -r オプション:ディレクトリ単位で再帰的に比較する
2つのディレクトリ配下のファイルをまとめて比較できます。サーバー移行や環境の差異を確認するときに強力です。# ディレクトリ単位で比較 diff -r /etc/httpd/conf/ /etc/httpd/conf.bak/ # unified形式と組み合わせる diff -ru /etc/httpd/conf/ /etc/httpd/conf.bak/ # 特定の拡張子を除外して比較する diff -ru /etc/httpd/ /tmp/httpd_backup/ --exclude='*.log' --exclude='*.pid'
--exclude でログファイルや一時ファイルを除外すると、設定ファイルの差分だけに集中できます。8. -a オプション:バイナリファイルもテキストとして比較する
diffはバイナリファイルを検出すると「Binary files ~ differ」と表示して中身を比較しません。テキストとして強制的に比較したい場合は -a オプションを使います。# バイナリファイルもテキストとして比較 diff -a file1.bin file2.bin
応用・実務Tips
1. 設定ファイルの変更前後を比較する
サーバーの設定ファイルを編集する前に、バックアップを取ってから変更するのは鉄則です。変更内容の確認にdiffを使います。# タイムスタンプ付きでバックアップを取る sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.20260416 # (設定を編集した後で)変更箇所を確認 diff -u /etc/httpd/conf/httpd.conf.20260416 /etc/httpd/conf/httpd.conf
タイムスタンプ付きのファイル名にしておくと、複数回変更した場合でも「いつ時点のバックアップか」が一目でわかります。
2. パッチファイルを作成して適用する
diffの出力をファイルに保存すると「パッチファイル」として使えます。同じ変更を別のサーバーにも適用したいときに便利です。# パッチファイルを作成 diff -u httpd.conf.bak httpd.conf > httpd.patch # パッチの内容を確認 cat httpd.patch # 別のサーバーでパッチを適用 patch < httpd.patch # パッチを元に戻す(逆適用) patch -R < httpd.patch
# RHEL系 dnf install patch # または yum install patch
3. ディレクトリ全体のパッチを作成・適用する
ディレクトリ単位の変更をパッチにまとめることもできます。# ディレクトリ全体の差分をパッチファイルにする diff -ruN /tmp/httpd_original/ /tmp/httpd_modified/ > httpd_all.patch # パッチを適用する(-p1 で先頭のディレクトリ名を1階層除去) cd /etc/httpd/ patch -p1 < /tmp/httpd_all.patch
-N オプションは、片方にしか存在しないファイルを「空ファイルとの差分」として扱います。新規ファイルの追加もパッチに含められるため、ディレクトリ全体の変更を漏れなく記録できます。patch コマンドは対象ファイルを直接上書きします。本番環境で適用する前に、必ず --dry-run で事前確認してください。# パッチが正常に適用できるか事前確認する(ファイルは変更されない) patch --dry-run < httpd.patch patching file httpd.conf
.rej(リジェクト)ファイルが生成されることがあります。.rej ファイルが残っていたら手動で対応が必要です。4. vimdiffで視覚的に比較・編集する
vimdiff(vimのdiffモード)を使うと、2つのファイルを左右に並べて色付きで比較できます。そのまま編集もできるので、差分を確認しながら修正したいときに最適です。# vimdiffで2つのファイルを比較 vimdiff file1.txt file2.txt
・]c:次の差分箇所にジャンプ
・[c:前の差分箇所にジャンプ
・:qa:両方のファイルを閉じて終了
・:wqa:両方のファイルを保存して終了
変更箇所がハイライトされるので、設定ファイルの細かい差分も見落としにくくなります。
5. diff出力をgrepで絞り込む
ディレクトリ比較などで出力が大量になる場合は、grepと組み合わせて必要な情報だけを抽出できます。# 変更があったファイル名だけを抽出 diff -rq /etc/httpd/conf/ /etc/httpd/conf.bak/ | grep differ # 片方にしかないファイルを抽出 diff -rq /etc/httpd/conf/ /etc/httpd/conf.bak/ | grep "Only in"
6. シェルスクリプトで差分を自動検知する
diffの終了コードを利用して、設定ファイルの変更を自動検知するスクリプトを書くこともできます。#!/bin/bash # 設定ファイルの変更を検知するスクリプト ORIGINAL="/etc/httpd/conf/httpd.conf.baseline" CURRENT="/etc/httpd/conf/httpd.conf" if diff -q "$ORIGINAL" "$CURRENT" > /dev/null 2>&1; then echo "変更なし" else echo "変更あり - 差分を表示します" diff -u "$ORIGINAL" "$CURRENT" fi
diff -q(quiet)は差分の内容を表示せず、「異なるかどうか」だけを報告します。終了コード 0 が差分なし、1 が差分ありなので、if文の条件として使えます。トラブルシュート・エラー対処
1. 「No such file or directory」が出たときの対処法
指定したファイルやディレクトリが存在しない場合に表示されます。# エラー例 diff: /etc/httpd/conf/httpd.conf.bak: No such file or directory
・パスのtypoを確認:ファイル名やディレクトリ名のスペルミスがないか確認する
・ファイルの存在を確認:ls コマンドでファイルが実際に存在するか確認する
・権限を確認:ファイルの読み取り権限がない場合も同様のエラーが出ることがある。sudo を付けて実行する
2. 「Binary files ~ differ」と表示される場合
diffがファイルをバイナリと判定した場合、中身の比較を行わずこのメッセージを表示します。# バイナリ判定された場合の出力 Binary files file1.dat and file2.dat differ
・テキストファイルなのにバイナリ判定された場合:diff -a で強制的にテキストとして比較する。UTF-8以外の文字コードや、NULLバイトを含むファイルでこの現象が起きることがある
・本当にバイナリファイルの場合:md5sum や sha256sum でハッシュ値を比較する方法が確実
# ハッシュ値でバイナリファイルを比較 md5sum file1.dat file2.dat
3. 「No newline at end of file」が出たときの対処法
diff を実行すると、末尾に次の警告が表示されることがあります。diff -u file1.txt file2.txt --- file1.txt 2026-04-16 10:00:00.000000000 +0900 +++ file2.txt 2026-04-16 14:30:00.000000000 +0900 @@ -1,3 +1,3 @@ line1 line2 -line3 \ No newline at end of file +line3_modified \ No newline at end of file
# ファイル末尾に改行がないことを確認する xxd file1.txt | tail -1 00000010: 6c69 6e65 33 line3 # 末尾に改行を追加する sed -i '$a\' file1.txt
本記事のまとめ
diffコマンドの使い方を一覧にまとめます。| やりたいこと | コマンド |
|---|---|
| 基本のファイル比較 | diff ファイル1 ファイル2 |
| unified形式で差分を表示 | diff -u ファイル1 ファイル2 |
| ファイルが同一か確認 | diff -s ファイル1 ファイル2 |
| 差分の有無だけを確認する | diff -q ファイル1 ファイル2 |
| 横並びで比較 | diff -y ファイル1 ファイル2 |
| 色付きで差分を表示 | diff -u --color ファイル1 ファイル2 |
| 大文字・小文字を無視して比較 | diff -i ファイル1 ファイル2 |
| 空白の違いを無視して比較 | diff -w ファイル1 ファイル2 |
| ディレクトリ単位で再帰比較 | diff -r ディレクトリ1 ディレクトリ2 |
| バイナリをテキストとして比較 | diff -a ファイル1 ファイル2 |
| パッチファイルを作成 | diff -u 変更前 変更後 > patch.diff |
| パッチを適用 | patch < patch.diff |
| パッチの適用を取り消す | patch -R < patch.diff |
| 視覚的に比較・編集 | vimdiff ファイル1 ファイル2 |
ファイルの中身を検索する
grep コマンドとの組み合わせについては「grepコマンドで文字列を検索する方法」、テキストの置換には「sedコマンドで文字列を置換する方法」もあわせてご覧ください。設定ファイルの差分確認、自信を持ってできていますか?
diffコマンドはサーバー管理の基本ですが、unified形式の読み方やパッチの運用まで体系的に学ぶ機会は意外と少ないものです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:killコマンドでプロセスを強制終了する方法|kill -9やkillall・pkillの使い分けも
- 前のページへ:sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます