【Linux】diffコマンドの使い方!2つのファイルの差分を比較・確認する方法

【Linux】diffコマンドの使い方!2つのファイルの差分を比較・確認する方法

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:4,403

Linux環境で2つのファイルの差分を比較・確認するための基本コマンド「diff」の使い方を徹底解説。行ごとの違いの表示方法や、パッチファイルの作成・適用手順まで、インフラエンジニアやプログラマー必須の実務テクニックをわかりやすく紹介します。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル環境で設定ファイルやプログラムのソースコードを修正した際、「どの部分を変更したのか後から分からなくなってしまった」「修正前後の違いを正確に把握したい」と困った経験はないでしょうか。

この記事を読むことで、Linuxの diff コマンドを用いたファイル比較の基本から、変更点をひと目で把握するための便利なオプション、さらには変更内容を他の環境に適用するためのパッチファイルの使い方までが理解できるようになります。

確認した環境 本記事のコマンドは以下の環境で動作を確認しています。

Linuxのdiffコマンドとは?

diff コマンドは、2つのファイルの内容を比較し、その行ごとの違い(差分)を出力するための標準的なコマンドラインツールです。プログラムのソースコードの変更点を確認するだけでなく、サーバーの設定ファイル(例: /etc/ssh/sshd_config など)のバックアップと現在の状態を比較し、どこを変更したのかを安全に検証する場面などで役立ちます。

デフォルトの挙動では、ファイル間の差異をテキストベースで算出し、どの行を追加・削除・変更すべきかを指示する形式で出力します。

diffコマンドの基本的な使い方と出力の見方

diff コマンドの基本的な構文は以下の通りです。

Terminal window
diff [オプション] <比較元ファイル> <比較先ファイル>

実際に2つのファイルを作成して比較してみましょう。

ステップ1: 比較元のファイル file1.txt を作成します。

Terminal window
cat << 'EOF' > file1.txt
apple
banana
cherry
date
EOF

ステップ2: 比較先のファイル file2.txt を作成します。 banana を blueberry に変更し、末尾に elderberry を追加しています。

Terminal window
cat << 'EOF' > file2.txt
apple
blueberry
cherry
date
elderberry
EOF

ステップ3: diff コマンドを実行して差分を確認します。

Terminal window
diff file1.txt file2.txt

実行結果の例:

2c2
< banana
---
> blueberry
4a5
> elderberry

この出力結果は、ファイル間の変更箇所を行番号と編集指示記号で表現する「通常形式(Normal format)」です。どの行を変更・追加・削除すれば2つのファイルの内容が一致するのかを示しており、差分の基本的な確認に利用できます。なお、diff -e を実行すると、エディタの ed で実行できる編集コマンドを出力する「EDスクリプト形式」になります。

変更・追加・削除された行の記号の意味

diff コマンドの標準出力では、記号やアルファベットを用いて変更内容を表現します。初心者の方がつまずきやすいこの出力形式の意味を整理します。

  1. 中央の変更指示記号

    • c (change): 行が変更されたことを示します(例: 2c2 は「1つ目のファイルの2行目を、2つ目のファイルの2行目に変更する」)。
    • a (append): 行が追加されたことを示します(例: 4a5 は「1つ目のファイルの4行目の後ろに、2つ目のファイルの5行目を追加する」)。
    • d (delete): 行が削除されたことを示します。
  2. 行頭の記号

    • <: 比較元ファイル(1つ目のファイル)に存在する行。
    • >: 比較先ファイル(2つ目のファイル)に存在する行。

上記の出力例を読み解くと、以下のようになります。

  • 2c2 から始まるブロック: 比較元の banana (<) が、比較先の blueberry (>) に変更されています。
  • 4a5 から始まるブロック: 比較先の elderberry (>) が新しく追加されています。

diffコマンドの便利なオプション一覧

標準の diff 出力は機械処理には向いていますが、人間の目では少し読みづらい場合があります。実務でよく使われる便利なオプションを組み合わせることで、比較作業を効率化できます。

大文字小文字や空白を無視して比較する(-i, -w, -b)

プログラムやドキュメントの比較では、インデントのスペースの増減や大文字・小文字のわずかな違いで差分検知されてしまうことがあります。実質的な内容が変わっていない場合、これらを無視したいときに以下のオプションが役立ちます。

  • -i (--ignore-case): 大文字と小文字の違いを無視して比較します。
  • -w (--ignore-all-space): 空白文字(スペースやタブ)の有無や数の違いをすべて無視して比較します(例: Hello World と HelloWorld も同じとみなします)。
  • -b (--ignore-space-change): 既存の空白文字の数の違いだけを無視して比較します(例: スペース1個とスペース3個は同じとみなしますが、空白の有無そのものは区別します)。
Terminal window
echo "Hello World" > sample1.txt
echo "hello world" > sample2.txt
diff -iw sample1.txt sample2.txt

この場合、大文字・小文字と空白の違いが無視されるため、差分は出力されません。

なお、-w オプションは空白文字の有無そのものまで無視するため、単語間のスペースが消えてしまった場合や、インデントがプログラムの動作に影響するPythonPython [パイソン]汎用プログラミング言語・YAMLYAML [ヤムル]YAML Ain't Markup Language。設定ファイルなどに使うデータフォーマットなどのファイルを比較する場合は注意が必要です。「スペースやタブの数の違いだけを無視したい」場合は -b オプションを使い分け、空白の違い自体が重要な意味を持つファイルでは通常の diff コマンドで比較することをおすすめします。

変更箇所を横並びで比較する(-y, —side-by-side)

2つのファイルを左右に並べて視覚的に比較したい場合は、-y オプション(または --side-by-side)を使用します。

Terminal window
diff -y file1.txt file2.txt

実行結果の例:

apple apple
banana | blueberry
cherry cherry
date date
> elderberry

横並び表示では、変更がある行の間に |(変更)、右側への >(追加)、左側への <(削除)の記号が表示されるため、視覚的に変更箇所を把握しやすくなります。表示幅が狭くて見づらい場合は、 --width オプションで幅を指定することも可能です(例: diff -y --width=120 file1.txt file2.txt)。

なお、左右の表示領域に収まらない長い行は、末尾が切り詰められる場合があります。長い設定値やソースコードを比較する場合は、-u オプションによるunified形式も併用するとよいでしょう。

差分を簡潔に表示するunified形式(-u)

現代のバージョン管理システム(GitGit [ギット]ソースコードの変更履歴を管理する分散型バージョン管理システムなど)でも標準的に採用されているのが、unified形式(統一形式)と呼ばれる -u オプションです。変更箇所の前後の文脈(コンテキスト)を含めて1つのまとまりとして表示するため、人間にとって最も理解しやすい出力形式となります。

Terminal window
diff -u file1.txt file2.txt

実行結果の例:

--- file1.txt 2026-11-04 10:00:00.000000000 +0900
+++ file2.txt 2026-11-04 10:01:00.000000000 +0900
@@ -1,4 +1,5 @@
apple
-banana
+blueberry
cherry
date
+elderberry
  • --- は比較元ファイル、 +++ は比較先ファイルを表します。
  • @@ -1,4 +1,5 @@ は、変更部分の位置情報(比較元は1行目から4行、比較先は1行目から5行)を示しています。
  • - で始まる行は削除された行、 + で始まる行は追加された行を表します。

ディレクトリ同士の差分を再帰的に比較する(-r)

diff コマンドは単一のファイルだけでなく、ディレクトリ(フォルダ)全体を再帰的に比較することも可能です。設定ファイルのバックアップディレクトリ全体や、ソースコードのプロジェクトディレクトリ同士を比較したい場合に -r(または --recursive)オプションを使用します。

Terminal window
diff -ur /etc/pam.d.bak /etc/pam.d

このコマンドを実行すると、指定したディレクトリ階層全体を走査し、含まれるファイルごとの差分を一括して unified 形式で出力します。片方のディレクトリにしか存在しないファイルについてもその旨(Only in ...)が通知されるため、システム移行時の設定漏れチェックなどに活用できます。

なお、ディレクトリ単位で後述のパッチファイルを作成したい場合は、-N(--new-file)オプションを組み合わせた diff -urN がよく使われます。-N を指定すると、片方のディレクトリにしか存在しないファイル(新規追加・削除されたファイル)を「もう片方には空ファイルが存在する」とみなして差分に含めることができます。

diffで作ったパッチファイルの使い方(patchコマンド)

diff コマンドで作成した unified 形式の出力は、「パッチファイル」として保存することで、別の環境やファイルへ変更内容をそのまま適用することができます。これを行うには patch コマンドを使用します。

patch は diffutils とは別のパッケージであるため、環境によっては標準でインストールされていない場合があります。未インストールの場合は以下のコマンドで導入できます。

Terminal window
# Ubuntu / Debian系
sudo apt install patch
# AlmaLinux / RHEL系
sudo dnf install patch

ステップ1: diff の出力結果をパッチファイルとして保存します。

Terminal window
diff -u file1.txt file2.txt > update.patch

実務でパッチを適用する場合は、万が一の失敗(一部の変更のみが適用されるなど)に備えて、事前に対象ファイルのバックアップを取得しておくことをおすすめします。また、--dry-run オプションを使用すると、実際にファイルを書き換えることなくパッチが適用可能かどうかを事前確認できます。

ステップ2: --dry-run オプションでパッチが問題なく適用できるか確認します。

Terminal window
patch --dry-run file1.txt < update.patch

問題なく適用できることを確認した後、通常の patch コマンドを実行すると、意図しないファイル変更のリスクを軽減できます。

ステップ3: 比較元である file1.txt に対して、作成したパッチファイルを適用します。

Terminal window
patch file1.txt < update.patch

実行時の出力例:

patching file file1.txt

これにより、file1.txt の中身が自動的に file2.txt と同じ内容に書き換わります。ネットワークが接続されていない隔離された環境や、多数のサーバーへ同一の修正を効率よく反映させたい場合に重宝する実務テクニックです。

なお、パッチ適用後に元の状態に戻したい(元に戻す=リバースする)場合は、-R オプションを付与してパッチを実行します。

Terminal window
patch -R file1.txt < update.patch

まとめ:diffコマンドでファイル変更を素早く把握しよう

今回は、Linux環境における diff コマンドの基本的な使い方と実務で役立つ応用テクニックについて解説しました。記事の重要なポイントは以下の通りです。

  • diff コマンドを使うことで、2つのファイルの変更点(追加・削除・置換)をテキストベースで正確に比較できる。
  • デフォルトの出力だけでなく、-i(大文字小文字無視)や -w(全空白無視)・-b(空白数の違い無視)を組み合わせることでノイズを減らせる。
  • -y オプションで横並び比較、 -u オプションでunified形式の読みやすい差分表示が可能になる。
  • ディレクトリ同士の比較には -r オプションが有効である(新規追加・削除ファイルも含めて差分化する場合は -N を併用)。
  • diff で作成したパッチファイルは、patch コマンドと組み合わせることで、別の環境やファイルへ変更内容を再現・適用できる。適用前に対象ファイルのバックアップや --dry-run による適用可否の確認を行うことで、意図しない変更のリスクを軽減できる。

インフラ運用やプログラミングにおいて、ファイルの状態変化を正確に追跡することはトラブルを防ぐ第一歩です。日々の業務や設定変更の確認に diff コマンドを活用してください。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top