Linuxコマンドdiffの使い方と5つのオプション

今回は、Linuxコマンドdiffの使い方とさまざまなオプションについて解説します。Linux環境でファイルやディレクトリの違いを確認して比較することは、開発者やシステム管理者にとって重要な作業の一つです。この作業を効率的に行うために、Linuxではさまざまなコマンドを提供しています。その中でも、diffコマンドは2つのファイルやディレクトリの違いを確認するのに非常に有用です。詳しい使い方を一緒に見ていきましょう。

Linuxコマンドdiffとは?

diffは「difference」の略で、2つのファイルまたはディレクトリを比較して違いを表示するLinuxコマンドです。このコマンドは、ファイルの内容がどのように異なるか、どこが異なるかを簡単に確認できるようにしてくれます。開発中のコードの変更点を追跡したり、設定ファイルの修正内容を比較する際によく使用されます。

基本的な使い方

最も基本的なdiffコマンドの使い方は次のとおりです。ここで、ファイル1とファイル2は比較したい2つのファイルを意味します。基本的に、diffは2つのファイルの内容を比較し、ファイル1にないがファイル2にある内容、またはその逆を表示します。

diff [オプション] ファイル1 ファイル2
ShellScript

ファイル1がファイル2にどう変わったかを考えると、diffの結果を理解しやすくなります。ちなみに、2つのファイルが同一であれば、何も出力されません。

例えば、次のような2つのファイルがあると仮定します。

file1.txt:

Hello World
This is a file.
Let's compare.
Plaintext

file2.txt:

Hello World
This is another file.
Let's compare.
Plaintext

これら2つのファイルをdiffコマンドで比較すると、次のような結果が表示されます。

diff file1.txt file2.txt
ShellScript

出力:

図1. Linuxコマンドdiff: 2つのファイルの比較
図1. Linuxコマンドdiff: 2つのファイルの比較

出力結果を解釈すると、「2c2」はfile1.txtの2行目とfile2.txtの2行目で変更が発生したことを意味します。< 記号はfile1.txtの内容を、> 記号はfile2.txtの内容を示します。つまり、file1.txtの2行目がfile2.txtの2行目と異なるということです。

diffコマンドの主要なオプション

diffコマンドは、さまざまなオプションを使って出力形式を調整したり、比較方法を制御したりできます。いくつかの重要なオプションを見ていきましょう。

-c (Context出力)

-cオプションは、差異のある行の前後数行を一緒に出力し、変更された内容が文脈の中でどのように見えるかをより理解しやすくします。基本的にdiffは変更された行のみを表示しますが、-cオプションを使用すると、前後のコンテキストを含めた差異を表示します。

diff -c file1.txt file2.txt
ShellScript

出力:

図2. Linuxコマンドdiff: -cオプションで前後の数行を一緒に出力して比較
図2. Linuxコマンドdiff: -cオプションで前後の数行を一緒に出力して比較

この出力は、変化した内容を周囲の行とともに表示し、比較を容易にします。

-u (Unified出力)

-uオプションは-cに似ていますが、より簡潔で一般的に使用される出力形式を提供します。これは、ソースコード管理ツールでよく使われる形式です。

diff -u file1.txt file2.txt
ShellScript

出力:

図3. Linuxコマンドdiff: -uオプションで統合して出力
図3. Linuxコマンドdiff: -uオプションで統合して出力

この形式では、変更された行番号とともに行の追加、削除、修正が直感的に表示されます。

-r (再帰的にディレクトリを比較)

-rオプションは、ディレクトリ内のすべてのファイルを再帰的に比較します。このオプションを使用すると、2つのディレクトリ構造が同一であるか、ファイル内容が一致しているかを簡単に確認できます。

diff -r dir1 dir2
ShellScript

このコマンドは、次のようにdir1とdir2ディレクトリ内のすべてのファイルを比較し、差異を出力します。a.txtファイルの場合、dir1/a.txtの1行目にdir2/a.txtの2行目が追加されたことがわかります。また、b.txtファイルはdir2ディレクトリにのみ存在することがわかります。

図4. Linuxコマンドdiff: -rオプションで再帰的にディレクトリを比較
図4. Linuxコマンドdiff: -rオプションで再帰的にディレクトリを比較

-i (大文字と小文字を無視)

-iオプションは、比較時に大文字と小文字を無視します。このオプションは、ファイルの内容が大文字と小文字だけが異なる場合でも同じものとして扱いたいときに便利です。

diff -i file1.txt file2.txt
ShellScript

このオプションを使用すると、以下の図のように「HELLO WORLD」と「Hello World」を同一と見なします。そして、同一と判断されると、diffは以下のように何も出力しません。

図5. Linuxコマンドdiff: -iオプションで大文字と小文字を無視して比較
図5. Linuxコマンドdiff: -iオプションで大文字と小文字を無視して比較

-q (簡単な差異報告)

-qオプションは、ファイルに差異があるかどうかだけを簡単に報告します。

diff -q file1.txt file2.txt
ShellScript

以下の図のように、ファイル内容が異なる場合、差異の詳細ではなく「Files filename1 and filename2 differ」というメッセージだけが表示されます。

図6. Linuxコマンドdiff: -qオプションで差異があるかだけを確認
図6. Linuxコマンドdiff: -qオプションで差異があるかだけを確認

diffコマンド使用時の注意点

  • ファイルの順序: diffコマンドではファイルの順序が重要です。順序によって出力内容が異なる可能性があるため、比較する順序を正確に指定する必要があります。先のファイルが後のファイルにどう変わったのかという観点から、違いを知らせるため、ファイルの順序は重要です。
  • 大容量ファイルの比較: 非常に大きなファイルを比較する場合、diffコマンドは多くのメモリと時間を消費する可能性があります。このような場合、diffの出力をファイルに保存することをお勧めします。
  • 出力の解釈: diffコマンドの基本出力はやや分かりにくいことがあります。オプションを適切に使用して、より直感的な出力を得ることが重要です。

まとめ

diffコマンドは、ファイルやディレクトリの違いを迅速かつ効率的に確認できる強力なツールです。基本的な使い方とさまざまなオプションをうまく活用すれば、コードレビュー、設定ファイルの管理、バックアップの確認など、さまざまな状況で役立ちます。特に-c、-uオプションを使用すると、より読みやすい比較結果を得ることができ、-rオプションでディレクトリ構造まで簡単に比較できます。

コマンドの使用に慣れると、diffは単なるファイル比較を超えて、開発環境でのデバッグ、ソースコード管理、システム設定など、さまざまな分野で必須のツールとなるでしょう。diffコマンドをしっかりと習得すれば、今後のLinux作業がより効率的で生産的になることでしょう。

リファレンス

関連ポスト

コメントする