Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linux diffコマンドの使い方:ファイルの差分表示とパッチ作成を実例付きで解説

Linuxのシェルから手軽にファイルやディレクトリを比較できるのがdiffコマンドです。この記事では、基本的な使い方からよく使われるオプション、パッチの作成・適用方法まで、具体例とともにわかりやすく解説します。

diffコマンドは、2つのファイルまたはディレクトリを行単位で比較し、その違い(差分)を出力します。

なぜファイルを比較するのか?

  • 同じ名前で内容が似ている2つのファイルがあり、その違いを確認したいとき
  • 開発中のプロジェクトで、新旧バージョンのプログラムコードの変更点を把握したいとき
  • 多数のファイルを別のドライブにコピーした後、破損や欠落なく正しくコピーできたか確認したいとき
  • 友人と同じフォルダを持っていて、自分側だけ変更を加えた場合。全ファイルを再送する代わりに、diffで変更部分だけを含むパッチを作成して送れば、相手はすべてをダウンロードし直さずに最新状態へ更新できます

ファイルを比較する理由は人それぞれですが、それでは早速diffの使い方を見ていきましょう。

diffコマンドの構文

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

構文のポイントは以下の通りです。

  • オプション(OPTIONS)は省略可能で、必要に応じて下の表から指定します
  • FILESには、比較対象となる2つのファイルのパスを半角スペースで区切って指定します

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

以下は、diffコマンドで特によく使われるオプションの一覧です(ユーザーマニュアルより抜粋)。

オプション 説明
-q, --brief ファイルが異なる場合のみ報告する
-s, --report-identical-files 2つのファイルが同一である場合に報告する
-u, -U NUM, --unified[=NUM] 統一(unified)形式でコンテキストとしてNUM行(デフォルトは3行)を出力する
-N, --new-file 存在しないファイルを空のファイルとして扱う
-l, --paginate 出力を「pr」コマンドに渡してページ分割する
-r, --recursive 見つかったサブディレクトリを再帰的に比較する
--no-dereference シンボリックリンクを辿らない
-a, --text すべてのファイルをテキストとして扱う
-d, --minimal より小さな変更セットを見つけるよう試みる
--speed-large-files 大きなファイルと散在する小さな変更が多いことを前提に処理する

すべてのオプションを確認したい場合は、次のコマンドでマニュアルを参照してください。

man diff

使用例

2つのファイルを比較する

diffコマンドの最も基本的な使い方です。指定した2つのファイルの差分がコンソールに出力されます。

diff file1.txt file2.txt

出力をファイルに保存する(リダイレクト)

パッチを作成するのではなく、単に差分を確認したいだけなら、出力をファイルにリダイレクトしておくと便利です。差分が多い場合でも、ターミナルの表示が途切れる心配がありません。

diff -q file1.txt file2.txt > differences.txt

このコマンドを実行すると、differences.txtが作成され(既に存在する場合は上書きされるので注意!)、2つのファイルの比較結果がまとめられます。

-q(--brief)オプションを付けると、同じファイルは無視され、差分があるものだけが簡潔に表示されます。詳細な差分行まで確認したい場合は、-qを外して実行してください。

ディレクトリを比較する

ディレクトリ同士も比較できます。-r(--recursive)オプションを付けると、サブディレクトリの内容まで再帰的に比較されます。

diff -r -q /path/to/dir1 /path/to/dir2

ここでも-qオプションを使い、差分のある項目だけを表示させています。

大きなファイルを比較する場合

diffは比較対象のファイルをすべて読み込んで照合するため、処理が重く、時間がかかることがあります。

--speed-large-filesオプションを付けると、diffのアルゴリズムが大きなファイル向けに調整され、比較が高速化されます。

パッチファイルを作成する

「パッチ」とは、2つのファイル間の差分を記録したファイルのことです。これを最初のファイルの別コピーに適用すれば、2番目のファイルと同じ内容に更新できます。作成には次のコマンドを使います。

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

-uオプションを付けると、差分が「統一形式(unified format)」で出力されます。この形式はpatchコマンドが解釈でき、元のファイルに変更を反映させることができます。

友人や同僚にデータやプログラムコードを共有している場合、データセットやアプリケーション全体を送り直す代わりに、変更部分だけをパッチとして送れるので非常に便利です。

パッチを適用する

パッチを受け取った側は、次のようにpatchコマンドで適用できます。

patch original.txt < update.patch

パッチを取り消す

適用したパッチを間違えていた場合は、-Rオプションを付けて逆方向に実行することで元に戻せます。

patch -R original.txt < update.patch

ディレクトリ全体のパッチを作成する

次のコマンドでは、-r(再帰的)、-u(統一形式)、-N(存在しないファイルを空として扱う)の各オプションを組み合わせて、ディレクトリ全体の差分からパッチを作成します。

diff -ruN originalDir updatedDir > update.patch

ディレクトリにパッチを適用する

ディレクトリへのパッチ適用には-p0オプションを使用します。これにより、パッチ作成時と同じディレクトリ構造に対してそのまま適用されます。

patch -p0 < update.patch

ディレクトリのパッチを取り消す

最後に、ディレクトリに適用したパッチを取り消す(逆方向に実行する)方法です。

patch -R -p0 originalFile < patchFile

diffとpatchを組み合わせれば、変更箇所だけを軽量に共有・管理できるため、コードレビューやバックアップの検証など、さまざまな場面で役立ちます。まずは基本的なファイル比較から試してみてください。

  1. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行

  2. Windows 10で隠しファイル・隠しフォルダを表示する3つの方法

    オンライン環境において、大切なファイルを他人の目から守ることは非常に重要です。しかし、「隠したはずのファイルが見つからなくなってしまった」「隠しファイルの中身を確認したい」といった経験はありませんか? 実は、Windows 10には「隠しファイル」や「隠しフォルダ」という宝箱のような機能が備わっています。この記事では、Windows 10で隠しファイルや隠しフォルダを表示する方法を、初心者の方にもわかりやすく解説します。 それでは早速見ていきましょう! 方法1:エクスプローラーで隠しファイルを表示する 最も手軽なのが、この方法です。ファイルやフォルダの表示を管理しているのは「エクスプローラー