「本番サーバーにデプロイする前に、設定ファイルの差分を確認したい」
Linuxでサーバーを管理していると、設定ファイルの変更箇所を正確に把握する場面が頻繁にあります。
この記事では、diffコマンドの基本から、実務で最も使われるunified形式(-u)やディレクトリ比較(-r)、パッチの作成・適用まで、現場で必要な使い方をすべて解説します。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
diffコマンドとは?ファイルの差分を比較するコマンド
diffコマンドは、2つのファイルを比較して「どこが違うか」を表示するコマンドです。サーバー管理の現場では、設定ファイルの変更箇所を確認したり、バックアップとの差分をチェックしたりする場面で日常的に使います。
基本の書式は以下の通りです。
# diffコマンドの基本書式 diff [オプション] ファイル1 ファイル2
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. -i オプション:大文字・小文字を無視して比較する
大文字と小文字の違いを無視して比較したいときに使います。# 大文字・小文字を無視して比較 diff -i file1.txt file2.txt
4. -w オプション:空白の違いを無視して比較する
スペースやタブの違いを無視して、内容の変更だけを確認したいときに使います。# 空白の違いを無視して比較 diff -w file1.txt file2.txt
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
・<(小なり):ファイル1にだけある行
・>(大なり):ファイル2にだけある行
ターミナルの横幅が狭いと見づらくなるので、-W オプションで表示幅を指定するとよいでしょう。
# 表示幅を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/
8. -a オプション:バイナリファイルもテキストとして比較する
diffはバイナリファイルを検出すると「Binary files ~ differ」と表示して中身を比較しません。テキストとして強制的に比較したい場合は -a オプションを使います。# バイナリファイルもテキストとして比較 diff -a file1.bin file2.bin
応用・実務Tips
1. 設定ファイルの変更前後を比較する(.bakファイルとの比較)
サーバーの設定ファイルを編集する前に、バックアップを取ってから変更するのは鉄則です。変更内容の確認にdiffを使います。# 変更前にバックアップを取る cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak # (設定を編集した後で)変更箇所を確認 diff -u /etc/httpd/conf/httpd.conf.bak /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. vimdiffで視覚的に比較・編集する
vimdiff(vimのdiffモード)を使うと、2つのファイルを左右に並べて色付きで比較できます。そのまま編集もできるので、差分を確認しながら修正したいときに最適です。# vimdiffで2つのファイルを比較 vimdiff file1.txt file2.txt
・]c:次の差分箇所にジャンプ
・[c:前の差分箇所にジャンプ
・:qa:両方のファイルを閉じて終了
・:wqa:両方のファイルを保存して終了
変更箇所がハイライトされるので、設定ファイルの細かい差分も見落としにくくなります。
4. 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"
トラブルシュート・エラー対処
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
本記事のまとめ
diffコマンドの使い方を一覧にまとめます。| やりたいこと | コマンド |
|---|---|
| 基本のファイル比較 | diff ファイル1 ファイル2 |
| unified形式で差分を表示 | diff -u ファイル1 ファイル2 |
| ファイルが同一か確認 | diff -s ファイル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 |
| 視覚的に比較・編集 | vimdiff ファイル1 ファイル2 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
