Linuxのdiff命令

9486 ワード


diffを読む:http://www.ruanyifeng.com/blog/2012/08/how_to_read_.diff.
菜鳥教程:https://www.runoob.com/linux/linux-comm-diff.html diff命令詳細:https://www.cnblogs.com/wf-linux/p/9488257.htmlhttp://man.linuxde.net/diffhttps://www.cnblogs.com/everest33Tong/p/6868654.html
 
Linux diffコマンドは、ファイルの違いを比較するために使用されます.
diffは逐行的にテキストファイルの異同箇所を比較する.ディレクトリを比較する場合、diffはディレクトリの同じファイル名のファイルを比較しますが、そのサブディレクトリを比較することはできません.
 
diff file_1 file_2  diffはこの二つのファイルの違いを教えてくれます.その表示結果がよく分かりませんので、diffをどうやって読むかを説明します.
 
パラメータ:
-:           。      -c -u      ;
-a --text:diff            ;
-b --ignore-space-change:          ;
-B --ignore-blank-lines:      ;
-c:      ,       ;
-C --context:   “-c-”    ;
-d --minimal:        ,         ;
-D ifdef:                  ;
-e --ed:           ed script  ;
-f -forward-ed:       ed script  ,                ;
-H --speed-large-files:      ,     ;
-l --ignore-matching-lines:             ,                      ,            ;
-i --ignore-case:         ;
-l --paginate:     pr     ;
-n --rcs:      RCS      ;
-N --new-file:      ,   A         ,     :Only in  ,  A    -N  , diff    A           ;
-p:       C         ,           ;
-P --unidirectional-new-file: -N  ,                        ,                ;
-q --brief:       ,        ;
-r --recursive:         ;
-s --report-identical-files:         ,      ;
-S --starting-file:      ,          ;
-t --expand-tabs:    , tab    ;
-T --initial-tab:       tab      ;
-u,-U --unified=:                ;
-v --version:      ;
-w --ignore-all-space:         ;
-W --width:   -y   ,    ;
-x --exclude:               ;
-X --exclude-from;                 ,   =        ;
-y --side-by-side:               ;
--help:    ;
--left-column:   -y   ,            ,              ;
--suppress-common-lines:   -y   ,       。
 
 
diffの3つのフォーマット
 
歴史的な理由で、diffには三つのフォーマットがあります.
  • ノーマルフォーマット
  • コンテキストフォーマット(context diff)
  • 合併フォーマット(unifud diff)
  • 順番に見に来ます.
     
     
    サンプルファイル
     
    説明を簡単にするために、まず二つの例ファイルを作成します.
    最初のファイルはf 1と言います.内容は1行1 aで、全部で7行です.
    a
    a
    a
    a
    a
    a
    a
    二つ目のファイルはf 2といいます.f 1を修正して作成します.4行目はハローになります.他のファイルは変わりません.
    a
    a
    a
    hello
    a
    a
    a
     
     
    通常フォーマットのdiff
     
    diffコマンドのNormalモードは、diffコマンドのデフォルトモードであり、diff両ファイルの場合、モードパラメータを追加しないとデフォルトモードと比較され、その効果は(--normal)と同じで、Normalモードの出力結果(前に説明した比較結果)をいくつかの例で説明します.二つのファイルの違いを直観するために、私はwindowsの下にBeyondCompreツールを通して二つのファイルの違いを並べます.スクリーンショットの下の黒い部分はdiffの比較出力スクリーンです.
    最初のファイルが2番目のファイルよりも少なくなりました.

    第一の書類は第二の書類より多く旅に出る場合:
    2
    最初のファイルと2番目のファイルが異なる場合:
    3
    上記diffコマンドは実行時に追加のモードパラメータが指定されていませんので、デフォルトのNormalモードを使用しています.効果はコマンドラインパラメータを追加するnormalと同じです.
     
    例を使って分析する
    今はf 1とf 2を比較します.
    このとき、diffは通常のフォーマットの結果を表示します.
      4c4
      < a
      ---
      > hello
  • 第一行:4 c 4  は、変更位置を説明するためのヒントです.4 c 4は3つの部分に分けられます.前の「4」はf 1の4行目の変化を表します.中間の「c」は変動のモードが内容変更(change)であり、他のモードは「増加」(a、代表addition)と「削除」(d、代表deletion)がある.後の「4」は、変動してf 2の4行目になることを表します.
  • 行目:
  • 第3行:---F 1とf 2を分割するために使用されます.
  • 第四行:>b  二行目と似ています.>b:前の大きな番号はf 2を表しています.行を追加しました.後の「ハロー」はその行の内容を表しています.最初のUnix(AT&TバージョンのUnix)は、このようなフォーマットのdiffを使っています.
  •  
     
    コンテキストフォーマットのdiff:Contectモード
     
    前世紀の80年代初め、カリフォルニア大バークリー校がBSD版のUnixを出した時、diffの表示結果は簡単すぎて、文脈に参加したほうがいいと思います.したがって、コンテキストフォーマットのdiffが発売された.
    デフォルトのモード出力結果は、実際にはコンピュータの考え方に合致しており、直感的ではないので、その出力結果はよく理解されていません.diffコマンドはデフォルトモード以外に、他の2つのモードを提供しています.
    diffコマンドはConteextモードを適用します.コマンドラインパラメータdiff-cを追加するだけです.  はい、まず二つのケースファイルを見ます.
    33
    次にこの二つのファイルをdiffとして説明します.  -c方式で比較した結果:
    3
     
    例を使って分析する
    コンテキストモードの使用方法は、cパラメータ(contextを表す)を追加します.
    表示結果は以下の通りです.
    $ diff -c f1 f2
    *** f1	2019-05-20 14:22:15.111801433 +0800
    --- f2	2019-05-20 14:22:27.401207382 +0800
    ***************
    *** 1,7 ****
      a
      a
      a
    ! a
      a
      a
      a
    --- 1,7 ----
      a
      a
      a
    ! hello
      a
      a
      a
    この結果は四つの部分に分けられます.
  • 第一部の2行は、2つのファイルの基本状況:ファイル名と時間情報を表示します.        *** f 1    2019-05-20 14:22:15.111801433+0800        --- f 2    2019-05-20 14:22:27.407382+0800ヒント:「**」は変動前のファイルを表し、「-」は変動後のファイルを表します.
  • 第二部分は15の星号で、書類の基本状況と変動内容を分割します.
  • 第3部分は、変動前のファイル、すなわちf 1を表示する.****1,7**** a. a. aa. a. a. aこのとき、変化した4行目だけでなく、4行目の前の3行と後ろの3行が表示されるので、全部で7行が表示されます.ですから、前の「****1,7***」は1行目から7行連続ということです.また、ファイルの内容の各行の先頭には、もう一つのマークがあります.空であれば、その行に変化がないことを表します.感嘆符なら、行に変更があることを表します.マイナス記号(-)であれば、行が削除されることを表します.プラス記号(+)であれば、この行為が新たに増加したことを示します.
  • 第4部分は変動後のファイル、すなわちf 2を表示する.---1,7---- a. a. aハロー a. a. a変更行(4行目)以外にも、コンテキストごとに3行ずつ表示され、合計7行が表示されます.
  •  
     
    統合フォーマットのdiff:つまりUnifiedモードです.
     
    二つのファイルの類似度が高い場合、コンテキストフォーマットのdiffは、多くの重複した内容を表示し、空間を浪費する.1990年にGNU diffが先行して「合併フォーマット」のdiffを発売し、f 1とf 2の文脈を合わせて表示した.
    diffにはまた、Unifiedモードという比較方法があり、コマンドライン–uを使ってこのモードの比較を実行します.その比較結果はConteextモードと似ていますが、出力を簡略化しました.私達は私達のケースファイルを見てみます.上の通りです.
    3
    diff–uを使って比較した結果:
    3
    比較結果はContectモードとほぼ同じですが、比較結果を統合しました.
     
    例を使って分析する
    uパラメータ(unifedを表す)を追加します.$diff-u f 1 f 2
    表示結果は以下の通りです.
    $ diff -u f1 f2
    --- f1	2019-05-20 14:22:15.111801433 +0800
    +++ f2	2019-05-20 14:22:27.401207382 +0800
    @@ -1,7 +1,7 @@
     a
     a
     a
    -a
    +hello
     a
     a
     a
    第一部は、文書の基本情報でもある.            --- f 1    2019-05-20 14:22:15.111801433+0800           +++ f 2    2019-05-20 14:22:274.01207382+0800            「-」は変動前の文書を表し、「+++」は変動後の書類を表します.
    第二部分は、変動の位置が二つ@で始まると終わります.            @@ -1,7+1,7@            前の「−1,7」は3つの部分に分けられます.マイナス記号は最初のファイル(すなわちf 1)を表し、「1」は1行目を表し、「7」は7行連続を表します.合わせて、次は最初のファイルが1行目から7行連続ということです.            同様に、「+1,7」は変動を表し、第二の書類となり、第一行から7行連続となります.
    第三部分は、変動の具体的内容である.   a. a. a-a+ハロー a. a. a.
    変更された行以外にも、コンテキストごとに3行ずつ表示されます.二つのファイルのコンテキストを結合して表示しますので、「統合フォーマット」といいます.各行の一番前のマークは変更なし、マイナス記号は第一のファイル削除の行を表し、プラス記号は第二のファイルが追加された行を表します.
     
     
    gitフォーマットのdiff
     
    バージョン管理システムgitは、合併フォーマットdiffの変形体を使用しています.
    表示結果は以下の通りです.
            diff --git a/f1 b/f1
            index 6f8a38c..3235643 100644
            --- a/f1
            +++ b/f1
            @@ -1,7 +1,7 @@
             a
             a
             a
            -a
            +hello
             a
             a
             a
    最初の行は結果をgit形式のdiffと表します.    diff--git a/f 1 b/f 1    比較したのは、aバージョンのf 1(すなわち変動前)とbバージョンのf 1(すなわち変動後)です.
    2行目は、2つのバージョンのgitハッシュ値(index領域の6 f 8 a 38 cオブジェクトと、ワークディレクトリ領域の449 b 072オブジェクトと比較)を表し、最後の6桁の数字はオブジェクトのモード(通常ファイル、644パーミッション)である.    index 6 f 8 a 38 c.4.49 b 072 100644
    第三行は比較を行う二つのファイルを表します.---a/f 1++b/f 1
    「-」は変動前のバージョンを表し、「++」は変動後のバージョンを表します.
    後の行はすべて公式の合併フォーマットdiffと同じです.
    @@-1,7+1,7@ a. a. a-a+ハロー a. a. a.
     
     
    ディレクトリを比較
     
    diffを使って二つのディレクトリを比較できます.比較形式は  diff  ディレクトリー1  ディレクトリー2は下記のディレクトリの比較結果を調べます.
    3
    二つのディレクトリを比較する場合、あるファイルはあるディレクトリにしか存在しません.別のディレクトリにはありません.同名のファイルが存在すると、この二つのファイルの違いを比較します.ディffはディレクトリを比較した結果、私達はgrepコマンドを結合して、私達の欲しい出力を絞り出すことができます.例えば、二つのディレクトリの下の違うファイルを出力するだけで、あるディレクトリの他のディレクトリが存在しない出力記録を無視します.
     
     
     
    例1:2つのファイルを比較する
    [root@localhost test3]# diff log2014.log log2013.log 
    3c3
    < 2014-03
    ---
    > 2013-03
    8c8
    < 2013-07
    ---
    > 2013-08
    11,12d10
    < 2013-11
    < 2013-12
    上の「3 c 3」と「8 c 8」は、3行目と8行目では、ロゴ2014.4 logとロゴ20434 logファイルの内容が異なることを示しています.「11,12 d 10」は、第1のファイルが第2のファイルよりも多くなった11,12行を表します.
     
    例2:並列フォーマット出力
    [root@localhost test3]# diff log2014.log log2013.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2014-03               | 2013-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-07               | 2013-08
    2013-09                 2013-09
    2013-10                 2013-10
    2013-11               <
    2013-12               <
    [root@localhost test3]# diff log2013.log log2014.log  -y -W 50
    2013-01                 2013-01
    2013-02                 2013-02
    2013-03               | 2014-03
    2013-04                 2013-04
    2013-05                 2013-05
    2013-06                 2013-06
    2013-07                 2013-07
    2013-08               | 2013-07
    2013-09                 2013-09
    2013-10                 2013-10
                          > 2013-11
                          > 2013-12
    説明:
  • 「124」は前後の2つのファイルの内容が異なることを示しています.
  • "
  • ">"は、後ろのファイルが前のファイルより1行多くなったことを示しています.