今号では、2つのファイルの内容を比較する diff コマンドの使い方やオプションについてご紹介します!
diff コマンドとは
diff コマンドは、2つのファイルやディレクトリの内容を比較し、異なる箇所 (差分) を出力します。
私たちは日頃の業務で、バージョンごとのソースコードの差分を確認したり、お客様から提供いただいた設定ファイルがデフォルトからどのように変更されているかを確認する事に使用しています。
また、ただ差分を確認するだけではなく、差分の表示形式を変更したり、比較する際の詳細な条件を指定する事もできます。
基本の書式
diff コマンドの基本の書式は以下の通りです。
(必要に応じて) オプションを指定した後に、比較する 2つのファイルを指定します。
$ diff <オプション> ファイル1 ファイル2
- 2つのファイルの内容に差分がない場合
ファイル1とファイル2の内容が同じである場合は、何も表示されません。$ cat text1.txt a b c $ cat text2.txt a b c $ diff text1.txt text2.txt $
- 2つのファイルの内容に差分がある場合
ファイル1とファイル2の内容が異なる場合は、以下のような出力結果となります。
結果に表示されている 3c3 は、ファイル1の 3行目の内容が、ファイル2の 3行目の内容に変更されている事を意味します (cは change のc)。$ cat text1.txt a b c $ cat text2.txt a b d $ diff text1.txt text2.txt 3c3 < c --- > d $
- 2つのファイルの内容に差分がある場合 (行が存在しない場合)
ファイル2で特定の行が存在しない (削除されている) 場合は、以下のような出力結果となります。
結果に表示されている 3d2 は、ファイル2ではファイル1の 3行目に該当する箇所が削除され、2行目の直後まで詰まった事を意味します (dは delete のd)。$ cat text1.txt a b c $ cat text2.txt a b $ diff text1.txt text2.txt 3d2 < c $
- 2つのファイルの内容に差分がある場合 (行が追加されている場合)
ファイル2にのみ特定の行が存在する (追加されている) 場合は、以下のような出力結果となります。
結果に表示されている 2a3 は、ファイル2ではファイル1の 2行目の直後に3行目が追加された事を意味します (aは append のa)。$ diff text1.txt text2.txt 2a3 > c $ cat text1.txt a b $ cat text2.txt a b c $ diff text1.txt text2.txt 2a3 > c
便利な diff コマンドのオプション
diff コマンドに様々なオプションを付けることによって、結果の出力形式を変更することができます。
出力形式を変更するオプションはたくさんありますが、今回は知っておくと便利なオプションを抜粋してご紹介します。
- ファイルに差異があるかの結果のみを表示する
-q オプションを指定すると、ファイルに差異がある箇所は出力せず、ファイルに差異があるかの結果のみを表示します。
※2つのファイルに差異がない場合は、何も表示しません。$ cat text1.txt a b c $ cat text2.txt a b c $ diff -q text1.txt text2.txt $
$ cat text3.txt a b c $ cat text4.txt a b $ diff -q text3.txt text4.txt ファイル text3.txt と text4.txt は異なります
- 結果を横並び (2列) で表示する
-y オプションを指定すると、ファイルの差異を横並び (2列) で表示します。
※2つのファイルに差異がない場合でも表示します。$ cat text1.txt a b c $ cat text2.txt a b c $ diff -y text1.txt text2.txt a a b b c c
$ cat text3.txt a b c $ cat text4.txt a b $ diff -y text3.txt text4.txt a a c | b c <
ディレクトリ同士を比較する場合
diff コマンドではファイルだけでなく、ディレクトリ同士を比較することができます。
その場合、ファイルを指定した場合とは異なり同じファイル名のファイル同士を比較します。
以下の例ですと、2つのディレクトリ (dir1、dir2) に上の例で使用した text1~4.txt をコピーしました。
その上で、dir2 の text3.txt のみ内容を変更し、また text4.txt を dir2 のみに配置しました。
diff コマンドを実行した結果、text3.txt のみ差異がある箇所を表示し、また text4.txt は dir2 のみに存在する旨を表示しています。
$ ls dir1 text1.txt text2.txt text3.txt $ ls dir2 text1.txt text2.txt text3.txt text4.txt $ diff dir1 dir2 diff dir1/text3.txt dir2/text3.txt 3d2 < c dir2 のみに存在: text4.txt