Linuxコマンド辞典 diffコマンド(テキスト処理)

2つのファイルの差分を表示する「diff」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

2つのファイルを比較しその違いを表示します。ファイルは「比較元 比較先」として2つ指定します、どちらか一方でファイルを指定してもう一方を「-」とした場合、標準入力からの入力と比較します。–from-fileオプションと–to-fileオプションを指定すれば順番は関係無くなります。

指定したファイルがディレクトリの場合は、中にあるファイルをアルファベット順に比較します。出力はcopied context形式/unified context形式/side-by-side形式があります。

context形式では「!」が変更された部分として表示されます。

unified形式では「+」が追加、「-」が削除された行になります。

side-by-side形式では「|」は異なる行、「<」は削除された行、「>」は追加された行、「(」は旧ファイルにあるが無視できる行、「)」は新しいファイルにはあるが無視できる行、「\」は1番目の行だけ行末改行がない、「/」は2番目の行だけ行末改行がない状態です。

デフォルトではside-by-side形式の出力がされますが、出力形式はオプションで変更できます。比較的使われるのは「unified contex形式」です。diffで出力された変更ファイルはpatchなどのツールで利用されます。

書式

$ diff [オプション] [比較元ファイル|-] [比較先ファイル|-]

オプション

-q
–brief
違いがある場合はそれだけを報告し差分は表示しない
-s
–report-identical-files
ファイルに違いが無い場合も報告する
-u、-U 行数
–unified[=行数]
変更行周辺を指定行数だけunified形式で出力する。unified形式は変更箇所について
行頭に「-」を示したところが削除されたところ、「+」が追加されたところとして
示す
-u、-C 行数
–context[=行数]
変更行周辺を指定行数だけcopied形式で出力する。
copied形式は該当箇所行頭に「!」をつけて変更前と変更後を出力する
–from-file=ファイル名指定したファイル/ディレクトリを比較元とする。「-」を指定すれば標準入力が比較元になる
–to-file=ファイル名指定したファイル/ディレクトリを比較先とする。「-」を指定すれば標準入力が比較先となる
-r
–recursive
サブディレクトリを比較する場合は、そこも再帰的に比較する
-N
–new-file
ディレクトリ内比較で、片方にだけファイルがある場合は新しい空のファイルがあるものとして比較する
-e
–ed
変更前に実行すると変更後になるedスクリプトを出力する
-n
–rcs
RCS形式で出力する
-y
–side-by-side
2列でそれぞれ出力して変更を示す
-W カラム数
–width=カラム数
表示カラム数(横幅)を指定する
-l
–paginate
出力をprを通して整形したページを出力する
-t
–expand-tabs
タブをスペースに変換する
-b
–ignore-space-change
空白行が違うだけの場合は無視する

ファイルの比較(side-by-side形式)

「side-by-side形式」で異なるテキストを比較します。

$ diff 比較元ファイル 比較先ファイル

実行結果

[sunarin@localhost work]$ cat -n comm1.txt 
     1  A
     2  B
     3  C
     4  D
     5  F
[sunarin@localhost work]$ cat -n comm2.txt 
     1  A
     2  B
     3  C
     4  D
     5  E
     6  G
[sunarin@localhost work]$ diff comm1.txt comm2.txt 
5c5,6
< F
---
> E
> G
[sunarin@localhost work]$ 
diff画像

ファイルの比較(copied contex形式)

「copied contex形式」で異なるテキストを比較します。2つのファイルで差分がある箇所は「!」で表示されます。

$ diff -c 比較元ファイル 比較先ファイル

実行結果

[sunarin@localhost work]$ diff -c comm1.txt comm2.txt 
*** comm1.txt   2022-05-04 09:30:47.486577000 +0900
--- comm2.txt   2022-05-04 09:30:24.165577000 +0900
***************
*** 2,5 ****
  B
  C
  D
! F
--- 2,6 ----
  B
  C
  D
! E
! G
[sunarin@localhost work]$ 

ファイルの比較(unified contex形式)

「unified contex形式」で異なるテキストを比較します。2つのファイルで差分がある箇所は「+」「-」で表示されます。

$ diff -u 比較元ファイル 比較先ファイル

実行結果

[sunarin@localhost work]$ diff -u comm1.txt comm2.txt 
--- comm1.txt   2022-05-04 09:30:47.486577000 +0900
+++ comm2.txt   2022-05-04 09:30:24.165577000 +0900
@@ -2,4 +2,5 @@
 B
 C
 D
-F
+E
+G
[sunarin@localhost work]$ 

ディレクトリを比較する

2つのディレクトリの差分を表示します。特定のファイルをバックアップしながら、作業している場合オリジナルとバックアップディレクトリの差分調査で使用されたりもします。

$ diff 比較元ディレクトリ名 比較先ディレクトリ名

実行結果

[sunarin@localhost work]$ diff ../work ./log/
diff ../work/comm1.txt ./log/comm1.txt
5c5
< Fgg #comm1.txt1に差分がある場合
---
> F
../work のみに存在: comm2.txt
./log/ のみに存在: comm3.txt
../work のみに存在: log
[sunarin@localhost work]$