diffコマンドでファイルを比較する方法|unified形式やディレクトリ比較も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > diffコマンドでファイルを比較する方法|unified形式やディレクトリ比較も
「設定ファイルを変更したけど、どこを変えたか分からなくなった」
「本番サーバーにデプロイする前に、設定ファイルの差分を確認したい」

Linuxでサーバーを管理していると、設定ファイルの変更箇所を正確に把握する場面が頻繁にあります。

この記事では、diffコマンドの基本から、実務で最も使われるunified形式(-u)やディレクトリ比較(-r)、パッチの作成・適用まで、現場で必要な使い方をすべて解説します。動作確認環境は RHEL 9.4 / Rocky Linux 9.4 です。

この記事のポイント

・diff ファイル1 ファイル2 で2つのファイルの差分を表示できる
・diff -u で unified 形式の見やすい差分出力が得られる
・diff -r でディレクトリ同士を再帰的に比較できる
・patchコマンドと組み合わせて差分を適用できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

diffコマンドとは?ファイルの差分を比較するコマンド

diffコマンドは、2つのファイルを比較して「どこが違うか」を表示するコマンドです。

サーバー管理の現場では、設定ファイルの変更箇所を確認したり、バックアップとの差分をチェックしたりする場面で日常的に使います。

基本の書式は以下の通りです。

# diffコマンドの基本書式 diff [オプション] ファイル1 ファイル2

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

unified形式の読み方は以下の通りです。

--- ファイル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'

片方にしか存在しないファイルも「Only in ディレクトリ名: ファイル名」という形で報告されます。--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

バックアップファイル(変更前)を第1引数、現在のファイル(変更後)を第2引数にするのがポイントです。こうすると「-(マイナス)が削除した行」「+(プラス)が追加した行」と直感的に読めます。

タイムスタンプ付きのファイル名にしておくと、複数回変更した場合でも「いつ時点のバックアップか」が一目でわかります。

2. パッチファイルを作成して適用する

diffの出力をファイルに保存すると「パッチファイル」として使えます。同じ変更を別のサーバーにも適用したいときに便利です。

# パッチファイルを作成 diff -u httpd.conf.bak httpd.conf > httpd.patch # パッチの内容を確認 cat httpd.patch # 別のサーバーでパッチを適用 patch < httpd.patch # パッチを元に戻す(逆適用) patch -R < httpd.patch

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

vimdiffの基本操作は以下の通りです。

]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"

-q オプションを付けると、差分の詳細は表示せず「ファイルが異なる」という事実だけを報告します。大量のファイルを比較するときに、まず全体像を把握するのに使います。

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

これはファイルの最終行に改行文字がないことを示しています。Linuxのテキストファイルは最終行に改行を含むのが慣例です。設定ファイルでこの警告が出た場合は、末尾に改行を追加してください。

# ファイル末尾に改行がないことを確認する 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
diff は地味なコマンドですが、設定ファイルの変更管理やトラブルシュートで欠かせない存在です。「変更する前にバックアップを取り、変更後に diff で確認する」という習慣を身につけておくと、障害発生時に原因特定が格段に速くなります。

ファイルの中身を検索する grep コマンドとの組み合わせについては「grepコマンドで文字列を検索する方法」、テキストの置換には「sedコマンドで文字列を置換する方法」もあわせてご覧ください。

設定ファイルの差分確認、自信を持ってできていますか?

diffコマンドはサーバー管理の基本ですが、unified形式の読み方やパッチの運用まで体系的に学ぶ機会は意外と少ないものです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。