知っておくとちょっと便利!2つのファイルを比較する diff コマンド

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

今号では、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
アバター画像
About 貝野 友香 69 Articles
OSSよろず相談室でサポートをやっています。時々ライブ配信や勉強会に出ていることもあります。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる