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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

バックアップファイル(変更前)を第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. vimdiffで視覚的に比較・編集する

vimdiff(vimのdiffモード)を使うと、2つのファイルを左右に並べて色付きで比較できます。そのまま編集もできるので、差分を確認しながら修正したいときに最適です。

# vimdiffで2つのファイルを比較 vimdiff file1.txt file2.txt

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

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

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

トラブルシュート・エラー対処

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

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

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

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

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

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

宮崎 智広

この記事を書いた人

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

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

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

\n\n\n\n\n\n\n\n\n