LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネル環境で設定ファイルやプログラムのソースコードを修正した際、「どの部分を変更したのか後から分からなくなってしまった」「修正前後の違いを正確に把握したい」と困った経験はないでしょうか。
この記事を読むことで、Linuxの diff コマンドを用いたファイル比較の基本から、変更点をひと目で把握するための便利なオプション、さらには変更内容を他の環境に適用するためのパッチファイルの使い方までが理解できるようになります。
確認した環境 本記事のコマンドは以下の環境で動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS / AlmaLinux 9.4
- シェル: Bash
- ツール: diff (GNU diffutils) 3.10 (Ubuntu 24.04) / 3.7 (AlmaLinux 9.4)
Linuxのdiffコマンドとは?
diff コマンドは、2つのファイルの内容を比較し、その行ごとの違い(差分)を出力するための標準的なコマンドラインツールです。プログラムのソースコードの変更点を確認するだけでなく、サーバーの設定ファイル(例: /etc/ssh/sshd_config など)のバックアップと現在の状態を比較し、どこを変更したのかを安全に検証する場面などで役立ちます。
デフォルトの挙動では、ファイル間の差異をテキストベースで算出し、どの行を追加・削除・変更すべきかを指示する形式で出力します。
diffコマンドの基本的な使い方と出力の見方
diff コマンドの基本的な構文は以下の通りです。
diff [オプション] <比較元ファイル> <比較先ファイル>実際に2つのファイルを作成して比較してみましょう。
ステップ1: 比較元のファイル file1.txt を作成します。
cat << 'EOF' > file1.txtapplebananacherrydateEOFステップ2: 比較先のファイル file2.txt を作成します。 banana を blueberry に変更し、末尾に elderberry を追加しています。
cat << 'EOF' > file2.txtappleblueberrycherrydateelderberryEOFステップ3: diff コマンドを実行して差分を確認します。
diff file1.txt file2.txt実行結果の例:
2c2< banana---> blueberry4a5> elderberryこの出力結果は、ファイル間の変更箇所を行番号と編集指示記号で表現する「通常形式(Normal format)」です。どの行を変更・追加・削除すれば2つのファイルの内容が一致するのかを示しており、差分の基本的な確認に利用できます。なお、diff -e を実行すると、エディタの ed で実行できる編集コマンドを出力する「EDスクリプト形式」になります。
変更・追加・削除された行の記号の意味
diff コマンドの標準出力では、記号やアルファベットを用いて変更内容を表現します。初心者の方がつまずきやすいこの出力形式の意味を整理します。
-
中央の変更指示記号
c(change): 行が変更されたことを示します(例:2c2は「1つ目のファイルの2行目を、2つ目のファイルの2行目に変更する」)。a(append): 行が追加されたことを示します(例:4a5は「1つ目のファイルの4行目の後ろに、2つ目のファイルの5行目を追加する」)。d(delete): 行が削除されたことを示します。
-
行頭の記号
<: 比較元ファイル(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個は同じとみなしますが、空白の有無そのものは区別します)。
echo "Hello World" > sample1.txtecho "hello world" > sample2.txtdiff -iw sample1.txt sample2.txtこの場合、大文字・小文字と空白の違いが無視されるため、差分は出力されません。
なお、-w オプションは空白文字の有無そのものまで無視するため、単語間のスペースが消えてしまった場合や、インデントがプログラムの動作に影響するPythonPython [パイソン]汎用プログラミング言語・YAMLYAML [ヤムル]YAML Ain't Markup Language。設定ファイルなどに使うデータフォーマットなどのファイルを比較する場合は注意が必要です。「スペースやタブの数の違いだけを無視したい」場合は -b オプションを使い分け、空白の違い自体が重要な意味を持つファイルでは通常の diff コマンドで比較することをおすすめします。
変更箇所を横並びで比較する(-y, —side-by-side)
2つのファイルを左右に並べて視覚的に比較したい場合は、-y オプション(または --side-by-side)を使用します。
diff -y file1.txt file2.txt実行結果の例:
apple applebanana | blueberrycherry cherrydate date > elderberry横並び表示では、変更がある行の間に |(変更)、右側への >(追加)、左側への <(削除)の記号が表示されるため、視覚的に変更箇所を把握しやすくなります。表示幅が狭くて見づらい場合は、 --width オプションで幅を指定することも可能です(例: diff -y --width=120 file1.txt file2.txt)。
なお、左右の表示領域に収まらない長い行は、末尾が切り詰められる場合があります。長い設定値やソースコードを比較する場合は、-u オプションによるunified形式も併用するとよいでしょう。
差分を簡潔に表示するunified形式(-u)
現代のバージョン管理システム(GitGit [ギット]ソースコードの変更履歴を管理する分散型バージョン管理システムなど)でも標準的に採用されているのが、unified形式(統一形式)と呼ばれる -u オプションです。変更箇所の前後の文脈(コンテキスト)を含めて1つのまとまりとして表示するため、人間にとって最も理解しやすい出力形式となります。
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)オプションを使用します。
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 とは別のパッケージであるため、環境によっては標準でインストールされていない場合があります。未インストールの場合は以下のコマンドで導入できます。
# Ubuntu / Debian系sudo apt install patch
# AlmaLinux / RHEL系sudo dnf install patchステップ1: diff の出力結果をパッチファイルとして保存します。
diff -u file1.txt file2.txt > update.patch実務でパッチを適用する場合は、万が一の失敗(一部の変更のみが適用されるなど)に備えて、事前に対象ファイルのバックアップを取得しておくことをおすすめします。また、--dry-run オプションを使用すると、実際にファイルを書き換えることなくパッチが適用可能かどうかを事前確認できます。
ステップ2: --dry-run オプションでパッチが問題なく適用できるか確認します。
patch --dry-run file1.txt < update.patch問題なく適用できることを確認した後、通常の patch コマンドを実行すると、意図しないファイル変更のリスクを軽減できます。
ステップ3: 比較元である file1.txt に対して、作成したパッチファイルを適用します。
patch file1.txt < update.patch実行時の出力例:
patching file file1.txtこれにより、file1.txt の中身が自動的に file2.txt と同じ内容に書き換わります。ネットワークが接続されていない隔離された環境や、多数のサーバーへ同一の修正を効率よく反映させたい場合に重宝する実務テクニックです。
なお、パッチ適用後に元の状態に戻したい(元に戻す=リバースする)場合は、-R オプションを付与してパッチを実行します。
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ライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。