私が持っています file1.txt
this is the original text
line2
line3
line4
happy hacking !
およびfile2.txt
this is the original text
line2
line4
happy hacking !
GNU is not UNIX
私が行った場合: diff file1.txt file2.txt
取得:
3d2
< line3
5a5
> GNU is not UNIX
出力は一般的にどのように解釈されますか? <
は削除を意味しますが、何をするのか3d2
または5a5
意味ですか?
私が行った場合:
$ diff -u file1.txt file2.txt
--- file1.txt 2013-07-06 17:44:59.180000000 +0200
+++ file2.txt 2013-07-06 17:39:53.433000000 +0200
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
+GNU is not UNIX
結果はより明確ですが、何が@@ -1,5 +1,5 @@
意味ですか?
最初のdiff
出力(いわゆる "normald diff")の意味は次のとおりです
<
-file1.txtの行を示します
>
-file2.txtの行を示します
3d2
および5a5
は、影響を受けた行番号と実行されたアクションを示します。 d
は削除を表し、a
は追加を表します(およびc
は変更を表します)。文字の左側の番号はfile1.txtの行番号、右側の番号はfile2.txtの行番号です。したがって、3d2
は、file1.txtの3行目が削除され、file2.txtの行番号が2であることを示しています(削除すると、行カウンターが行番号2に戻ったと言えます)。 5a5
は、file1.txtの行番号5から開始し(前のアクションで行を削除した後は実際は空でした)、行を追加し、この追加された行がfile2.txtの番号5であることを示します。
diff -u
コマンドの出力は、形式が少し異なります(いわゆる「統一diff」形式)。ここでdiff
は、2つの別々のテキストではなく、1つのテキストを示しています。行@@ -1,5 +1,5 @@
の部分-1,5
はfile1.txtに関連し、部分+1,5
はfile2.txtに関連しています。彼らは、diff
がfile1.txtの行番号1から始まる5行の長さのテキストを表示することを教えてくれます。そして、file2.txtについても同じです-diff
は、1行目から始まる5行を示しています。
すでに述べたように、両方のファイルの行が一緒に表示されます
this is the original text
line2
-line3
line4
happy hacking !
+GNU is not UNIX
ここで、-
はfile1.txtから削除された行を示し、+
は追加された行を示します。
概要:
diff file1 file2
の場合、<
はfile2
に行がないことを意味し、>
はfile1
に行がないことを意味します。 3d2
と5a5
は無視できます。これらはpatch
でよく使用されるdiff
のコマンドです。
完全な回答:
* nixユーティリティの多くはTeXinfoのマニュアルと、より単純なman
ページを提供しています。これらにアクセスするには、info command
のようにinfo diff
を実行します。この場合、関心のあるセクションは次のとおりです。
2.4.2通常形式の詳細な説明
通常の出力形式は、1つ以上の違いの塊で構成されます。各ハンクは、ファイルが異なる1つの領域を示しています。通常の形式のハンクは次のようになります。
CHANGE-COMMAND
< FROM-FILE-LINE
< FROM-FILE-LINE...
---
> TO-FILE-LINE
> TO-FILE-LINE...
変更コマンドには3つのタイプがあります。それぞれは、最初のファイルの行番号またはコンマ区切りの行範囲、行う変更の種類を示す1文字、および2番目のファイルの行番号またはコンマ区切りの行範囲で構成されます。すべての行番号は、各ファイルの元の行番号です。変更コマンドのタイプは次のとおりです。
`LaR'
Add the lines in range R of the second file after line L of the
first file. For example, `8a12,15' means append lines 12-15 of
file 2 after line 8 of file 1; or, if changing file 2 into file 1,
delete lines 12-15 of file 2.
`FcT'
Replace the lines in range F of the first file with lines in range
T of the second file. This is like a combined add and delete, but
more compact. For example, `5,7c8,10' means change lines 5-7 of
file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.
`RdL'
Delete the lines in range R from the first file; line L is where
they would have appeared in the second file had they not been
私は使用することをお勧めします:
diff -rupP file1.txt file2.txt > result.patch
次に、result.patch
、違いがすぐにわかります。
コマンドラインスイッチの意味は次のとおりです。
-r:再帰的
-:行番号を表示します
-p(small):C関数の違いを示します
-P(大文字):複数のファイルの場合、フルパスが表示されます
上記の答えは良いです。しかし、初心者としては少し理解が難しいことに気づき、さらに詳しく調べてみると、非常に役立つリンクが見つかりました。 Linux Diff Command&Examples
このサイトでは、コンセプトをシンプルで理解しやすい方法で説明しています。
このように考えると、diffコマンドが理解しやすくなります。
基本的に、1つのファイルを変更して2番目のファイルと同一にするための一連の指示を出力します。
以下のケースのそれぞれがよく説明されています:
aは追加、cは変更、dは削除
diff <file-to-edit> <file-with-updates> #Rather than diff f1 f2
結果編集するファイルを操作(file1)、それにさまざまな更新を適用します
類似性、これらの名前変更は結果を概念化するのに役立ちます:
2,4d1 --- D(s)-d-N --- d elete( 'remove')D行。次に、両方のラインNで同期します。
4a2,4 --- N -as)--- N行目、---(a dd( 'insert')更新ラインU
注:それらはほぼ対称です
2,4c5,6 --- R(s)-cs)---削除R(s)行、更新された行を挿入= U(s)代わりに。
4a2,4 --- 4から始まり、更新された行2-4を追加(挿入)(つまり、2,4は2、3および4を意味します)
2,4d1 --- 2-4行目を削除します。
2,4c5,6 ---行2〜4を削除し、更新された行5〜6を挿入する
これらはストリームエディタコマンドであり、マシンで処理されるように設計されていることを知っています。たとえば、実際には---(edコマンドの追加であり、挿入ではありませんが、最終的にファイルに対して行われている挿入を考えると、より役立ちます。彼らはストリーム操作を使用していますが、結果の観点から考えるのが好きです。