【diff】Linuxで2つのファイルの差分を表示するコマンド

diffコマンドは2つのファイルの差分を表示するコマンドです。

diffコマンドの使い方

diffコマンドの書式は以下の通りです。

diff [オプション] 変更前のファイル 変更後のファイル

diffコマンドは差分を取得したい2つのファイルを指定します。

オプション

-a 強制的にテキストファイルとみなして比較を行う
-b スペース数の違いは無視する
-c context形式で出力する
-e edスクリプト形式で出力する
-i 大文字と小文字を区別しない
-n RCS形式で出力する
-q ファイルが違うかどうかだけを報告する
-r ディレクトリを比較するときサブディレクトリもすべて再帰的に比較する
-s 2つのファイルが同じ内容の場合に報告する
-u unified形式で出力する
-y side-by-side形式で出力する

ファイルの比較

以下の例は、変更前のファイルをfile1.htmlと変更後のファイルをfile2.htmlの差分を表示します。

$ diff file1.html file2.html
5a6
> <link rel="stylesheet" type="text/css" href="style.css" />
9c10,12
< test
---
> <h1>test1</h1>
> 
> <h1>test2</h1>
12d14
< <!-- サンプル -->

上の例で表示された結果の見方について説明します。

a(added)は追加、d(deleted)は削除、c(changed)は変更を表します。また、「<」は変更前のファイル、「>」は変更後のファイルを表します。

5a6
> <link rel="stylesheet" type="text/css" href="style.css" />

「5a6」の部分は、file1の5行目の直後に「>」の後に表示されているテキストが追加され、それ以降のテキストが6行目以降に繰り下がったことを示します。

9c10,12
< test
---
> <h1>test1</h1>
> 
> <h1>test2</h1>

「9c10,12」の部分は、file1の9行目がfile2の10〜12行目の「>」の後に表示されているテキストに変更されたことを示します。

12d14
< <!-- サンプル -->

「12d14」の部分は、file1の12行目の「<」の後に表示されているテキストが削除され、file2のそれ以降のテキストが14行の直後まで詰められたことを示します。 

context形式で表示する

context形式で表示するには、オプション「-c」を指定します。

$ diff -c file1.html file2.html
*** file1.html	2016-09-08 14:33:48.000000000 +0900
--- file2.html	2016-09-08 14:34:27.000000000 +0900
***************
*** 3,15 ****
  <head>
  <meta charset="utf-8" />
  <title>タイトル</title>
  </head>
  <body>
  
! test
  
  
- <!-- サンプル -->
  
  </body>
  </html>
--- 3,17 ----
  <head>
  <meta charset="utf-8" />
  <title>タイトル</title>
+ <link rel="stylesheet" type="text/css" href="style.css" />
  </head>
  <body>
  
! <h1>test1</h1>
! 
! <h1>test2</h1>
  
  
  
  </body>
  </html>

context形式では、差異のある行は変更された行から前後に数行表示されます。「+」は追加、「-」は削除、 「!」変更を示します。

unified形式で表示する

unified形式で表示するには、オプション「-u」を指定します。

$ diff -u file1.html file2.html
--- file1.html	2016-09-08 14:33:48.000000000 +0900
+++ file2.html	2016-09-08 14:34:27.000000000 +0900
@@ -3,13 +3,15 @@
 <head>
 <meta charset="utf-8" />
 <title>タイトル</title>
+<link rel="stylesheet" type="text/css" href="style.css" />
 </head>
 <body>
 
-test
+<h1>test1</h1>
+
+<h1>test2</h1>
 
 
-<!-- サンプル -->
 
 </body>
 </html>

unified形式では、file1とfile2の差異のある行を記号で示します。追加が「+」、削除が「-」でわかるようになっています。

side-by-side形式で表示する

2つのファイルを左右に並べて表示するには、オプション「-y」を指定します。以下の例では、「-W 80」で表示幅を設定しています。

$ diff -y -W 80 file1.html file2.html
<!DOCTYPE html>                         <!DOCTYPE html>
<html>                                  <html>
<head>                                  <head>
<meta charset="utf-8" />                <meta charset="utf-8" />
<title>タイトル</title>                 <title>タイトル</title>
                                      > <link rel="stylesheet" type="text/css
</head>                                 </head>
<body>                                  <body>

test                                  | <h1>test1</h1>
                                      >
                                      > <h1>test2</h1>


<!-- サンプル -->                      <

</body>                                 </body>
</html>                                 </html>

差異のある行は「>, < , |」でわかるようになっています。

ファイルが異なるかどうかのみチェックする

ファイルが異なるかどうかのみチェックするには、オプションに「-s」を指定します。

$ diff -s file1.txt file2.txt
Files file1.txt and file2.txt are identical

チェックの結果が同一の場合、「-s」オプションを付けたときはメッセージを表示しますが、デフォルトでは何も表示されません。


イベント