このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:ユニファイド出力形式:diffコマンド

ユニファイド出力形式:diffコマンド

 システム管理やプログラム開発において、ファイルの変更点を把握することは非常に重要です。diffコマンドは、2つのファイル間の差分を表示するための強力なツールであり、その中でもユニファイド形式(Unified format)は変更内容を直感的に理解しやすい形式として広く利用されています。ここでは、diffコマンドのユニファイド形式について詳しく解説します。

diffコマンドの概要

 diffコマンドは、2つのテキストファイルを比較して、その差分を表示します。デフォルトでは、<> を使用して差分を示しますが、-uオプションを付けることでユニファイド形式で出力できます。

【書式】
diff [オフション] <比較元ファイル> <比較先ファイル>

ユニファイド形式

 ユニファイド形式では、変更部分だけでなく、その前後数行も合わせて表示されます。これにより、ファイルのどの部分が変更されたのかを文脈の中で理解しやすくなります。

  • 最初の2行:比較対象のファイル名と更新日時が表示されます。
  • 差分の表示
    追加された行:先頭に + が付与されます。
    削除された行:先頭に - が付与されます。
    変更のない行:そのまま表示されます。

差分の位置情報

差分の各ブロック(ハンク)の冒頭は、@@ から始まる行で、以下の形式で表されます。

【形式】
@@ -<元のファイルの開始行>,<元の行数> +<新しいファイルの開始行>,<新しい行数> @@

  • - の後:元のファイル(比較元)の差分開始行と行数。
  • + の後:新しいファイル(比較先)の差分開始行と行数。

差分の使い方とパッチ

 大きなファイルを他者と共有する際、変更後のファイル全体を送るのではなく、diffコマンドで生成した差分(パッチ)を送ることが一般的です。受け取った側は、元のファイルにこのパッチを適用して、変更後のファイルを再現できます。これにより、データ転送量を削減し、変更点を明確に伝えることができます。

 ユニファイド形式のパッチは、前後の行も含まれるため、元のファイルに多少の変更があっても適用しやすいという利点があります。

実践例

1.before.txt を作成

user01@ubuntu:~$ nano before.txt

before.txt の内容

1. Introduction to Linux
2. Understanding the Shell
3. Basic Commands
4. File Management
5. Text Editing
6. Processes and Jobs
7. Network Configuration
8. Security Basics
9. System Monitoring
10. Conclusion

2.after.txt を作成

before.txt をコピーして after.txt を作成します。

user01@ubuntu:~$ cp before.txt after.txt

3.after.txt を編集

user01@ubuntu:~$ nano after.txt

編集内容

  • 削除:5行目「5. Text Editing」を削除。
  • 変更:6行目「7. Network Configuration」を「7. Networking Fundamentals」に変更。
  • 追加:10行目に「11. Advanced Shell Scripting」を追加。

after.txt の内容

1. Introduction to Linux
2. Understanding the Shell
3. Basic Commands
4. File Management
6. Processes and Jobs
7. Network Fundamentals
8. Security Basics
9. System Monitoring
10. Conclusion
11. Advanced Shell Scripting

4.差分の確認

user01@ubuntu:~$ diff -u before.txt after.txt

出力結果

--- before.txt	2024-11-02 22:57:47.151603426 +0900
+++ after.txt	2024-11-02 22:59:29.032847354 +0900
@@ -2,9 +2,9 @@
 2. Understanding the Shell
 3. Basic Commands
 4. File Management
-5. Text Editing
 6. Processes and Jobs
-7. Network Configuration
+7. Network Fundamentals
 8. Security Basics
 9. System Monitoring
 10. Conclusion
+11. Advanced Shell Scripting

ハンクの範囲

各記号の意味

  • ---:比較元のファイル情報。
  • +++:比較先のファイル情報。
  • @@ -行番号,行数 +行番号,行数 @@:ハンクの位置情報。
  • (半角スペース):変更されていない行。
  • -:削除された行。
  • +:追加された行。

5.ユニファイド形式の解説

最初の2行

最初の2行には指定した2つのファイルのファイル名と更新日時が表示されます。

--- before.txt	2024-11-02 22:57:47.151603426 +0900
+++ after.txt	2024-11-02 22:59:29.032847354 +0900

ハンク

@@ -2,9 +2,9 @@

意味

  • 元のファイル(before.txt)の2行目から9行分。
  • 新しいファイル(after.txt)の2行目から9行分。
なぜ9行か

 差分のある行(削除・追加・変更)が、分かりやすいように、その前後の行(コンテキスト)を含めて9行分が表示されています。

ハンク内の変更点

削除

  • -5. Text Editing

変更

  • -7. Network Configuration
  • +7. Network Fundamentals

追加

  • +11. Advanced Shell Scripting

6.ファイルの削除

作業が完了したら、不要なファイルを削除します。

user01@ubuntu:~$ rm before.txt after.txt

まとめ

  • ユニファイド形式は、diffコマンドで差分を分かりやすく表示するための形式で、変更部分の前後も表示されるため、文脈を理解しやすい。
  • 差分の適用には patch コマンドを使用し、ユニファイド形式のパッチは多少の行ズレがあっても適用しやすい。
  • パッチの利点
    ・データ転送量の削減
    ・変更点の明確な伝達
    ・バージョン管理システムとの相性が良い。

 以上で、diffコマンドのユニファイド形式についての解説を終わります。日常のシステム管理や開発業務において、ファイルの変更点を効率的に把握するために、ぜひ活用してみてください。