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には三つのフォーマットがあります.
サンプルファイル
説明を簡単にするために、まず二つの例ファイルを作成します.
最初のファイルは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番目のファイルが異なる場合:
上記diffコマンドは実行時に追加のモードパラメータが指定されていませんので、デフォルトのNormalモードを使用しています.効果はコマンドラインパラメータを追加するnormalと同じです.
例を使って分析する
今はf 1とf 2を比較します.
このとき、diffは通常のフォーマットの結果を表示します.
4c4
< a
---
> hello
コンテキストフォーマットのdiff:Contectモード
前世紀の80年代初め、カリフォルニア大バークリー校がBSD版のUnixを出した時、diffの表示結果は簡単すぎて、文脈に参加したほうがいいと思います.したがって、コンテキストフォーマットのdiffが発売された.
デフォルトのモード出力結果は、実際にはコンピュータの考え方に合致しており、直感的ではないので、その出力結果はよく理解されていません.diffコマンドはデフォルトモード以外に、他の2つのモードを提供しています.
diffコマンドはConteextモードを適用します.コマンドラインパラメータdiff-cを追加するだけです. はい、まず二つのケースファイルを見ます.
次にこの二つのファイルをdiffとして説明します. -c方式で比較した結果:
例を使って分析する
コンテキストモードの使用方法は、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
この結果は四つの部分に分けられます.統合フォーマットのdiff:つまりUnifiedモードです.
二つのファイルの類似度が高い場合、コンテキストフォーマットのdiffは、多くの重複した内容を表示し、空間を浪費する.1990年にGNU diffが先行して「合併フォーマット」のdiffを発売し、f 1とf 2の文脈を合わせて表示した.
diffにはまた、Unifiedモードという比較方法があり、コマンドライン–uを使ってこのモードの比較を実行します.その比較結果はConteextモードと似ていますが、出力を簡略化しました.私達は私達のケースファイルを見てみます.上の通りです.
diff–uを使って比較した結果:
比較結果は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は下記のディレクトリの比較結果を調べます.
二つのディレクトリを比較する場合、あるファイルはあるディレクトリにしか存在しません.別のディレクトリにはありません.同名のファイルが存在すると、この二つのファイルの違いを比較します.ディ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
説明: