linux下檔案比較工具diff|cmp使用小結
轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。
1.diff
diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。
2.diff使用格式
(1)比較檔案
[plain] view plain copy print ?- diff filename_1 filename_2
diff filename_1 filename_2
(2)比較目錄
[plain]
view plain
copy
print
?
- diff dir_1 dir_2
diff dir_1 dir_2
diff命令常用的選項:
-b —— 忽略一行中的空字元的區別(例如“Hello World!!” 與 “Hello World!!”認為是一樣的)
-B —— 忽略空白行
-i —— 忽略大小寫的不同
-r —— 如果diff後面接的目錄時,會遞迴比較子目錄中的檔案不同
3.diff比較輸出的內容形式
diff輸出內容有三種格式:
[plain] view plain copy print ?- (1)正常格式(normal diff)
- (2)上下文格式(context diff)
- (3)合併格式(unified diff)
(1)正常格式(normal diff)
(2)上下文格式(context diff)
(3)合併格式(unified diff)
第一個檔案叫做f1,內容是每行一個a,一共7行。
- a
- a
- a
- a
- a
- a
- a
a
a
a
a
a
a
a
第二個檔案叫做f2,修改f1而成,第4行變成b,其他不變。
[plain]
view plain
copy
print
?
- a
- a
- a
- b
- a
- a
- a
a
a
a
b
a
a
a
(1)正常格式
現在對f1和f2進行比較:
[plain] view plain copy print ?- diff f1 f2
diff f1 f2
這時,diff就會顯示正常格式的結果:
[plain]
view plain
copy
print
?
- 4c4
- < a
- ---
- > b
4c4
< a
---
> b
輸出解釋:
第一行是一個提示,用來說明變動位置。它分成三個部分:前面的"4",表示f1的第4行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);後面的"4",表示變動後變成f2的第4行。第二行分成兩個部分。前面的小於號,表示要從f1當中去取該行的內容(也就是第4行),後面的"a"表示該行的內容。
第三行用來分割f1和f2。
第四行,類似於第二行。前面的大於號表示f2去取該行的內容,後面的"b"表示該行的內容。
(2)上下文格式
上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,覺得diff的顯示結果太簡單,最好加入上下文,便於瞭解發生的變動。因此,推出了上下文格式的diff。
它的使用方法是加入c引數(代表context)。
- diff -c f1 f2
diff -c f1 f2
顯示結果如下:
[plain]
view plain
copy
print
?
- *** f1 2012-08-29 16:45:41.000000000 +0800
- --- f2 2012-08-29 16:45:51.000000000 +0800
- ***************
- *** 1,7 ****
- a
- a
- a
- !a
- a
- a
- a
- --- 1,7 ----
- a
- a
- a
- !b
- a
- a
- a
*** f1 2012-08-29 16:45:41.000000000 +0800
--- f2 2012-08-29 16:45:51.000000000 +0800
***************
*** 1,7 ****
a
a
a
!a
a
a
a
--- 1,7 ----
a
a
a
!b
a
a
a
輸出結果解釋:
這個結果分成四個部分:
第一部分的兩行,顯示兩個檔案的基本情況:檔名和時間資訊。"***"表示變動前的檔案,"---"表示變動後的檔案。
第二部分是15個星號,將檔案的基本情況與變動內容分割開。
第三部分顯示變動前的檔案,即f1。這時不僅顯示發生變化的第4行,還顯示第4行的前面三行和後面三行,因此一共顯示7行。所以,前面的"*** 1,7 ****"就表示,從第1行開始連續7行。另外,檔案內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感嘆號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。
第四部分顯示變動後的檔案,即f2。除了變動行(第4行)以外,也是上下文各顯示三行,總共顯示7行。
(3)合併格式
如果兩個檔案相似度很高,那麼上下文格式的diff,將顯示大量重複的內容,很浪費空間。1990年,GNU diff率先推出了"合併格式"的diff,將f1和f2的上下文合併在一起顯示。它的使用方法是加入u引數(代表unified)。
- diff -u f1 f2
diff -u f1 f2
顯示的結果如下:
[plain]
view plain
copy
print
?
- --- f1 2012-08-29 16:45:41.000000000 +0800
- +++ f2 2012-08-29 16:45:51.000000000 +0800
- @@ -1,7 +1,7 @@
- a
- a
- a
- -a
- +b
- a
- a
- a
--- f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a
輸出結果解釋:
第一部分,也是檔案的基本資訊。"---"表示變動前的檔案,"+++"表示變動後的檔案。
第二部分,變動的位置用兩個@作為起首和結束。前面的"-1,7"分成三個部分:減號表示第一個檔案(即f1),"1"表示第1行,"7"表示連續7行。合在一起,就表示下面是第一個檔案從第1行開始的連續7行。同樣的,"+1,7"表示變動後,成為第二個檔案從第1行開始的連續7行。
第三部分是變動的具體內容。除了有變動的那些行以外,也是上下文各顯示3行。它將兩個檔案的上下文,合併顯示在一起,所以叫做"合併格式"。每一行最前面的標誌位,空表示無變動,減號表示第一個檔案f1中對應行的內容,加號表示第二個檔案f2中對應行的內容。
備註:
(1)在svn和git的版本管理系統中,svn diff及git diff輸出的內容類似於diff工具的合併格式。
(2)使用diff工具還可以製作檔案新舊版本的patch包,然後補丁包來升級或還原檔案版本。使用例子如下:
[plain] view plain copy print ?- #步驟一:製作補丁包patch
- diff -Naur passwd.old passwd.new > passwd.patch
- #步驟二:升級
- patch -p0 < passwd.patch
- #步驟三:還原
- patch -R -p0 < passwd.patch
#步驟一:製作補丁包patch
diff -Naur passwd.old passwd.new > passwd.patch
#步驟二:升級
patch -p0 < passwd.patch
#步驟三:還原
patch -R -p0 < passwd.patch
4.cmp
作用:diff是以行為單位進行檔案的比較,cmp是以位元組為單位進行檔案的比較。
使用格式:
[plain] view plain copy print ?- cmp [option] filename_1 filename_2
cmp [option] filename_1 filename_2
常用的選項:
-s —— 將所有的不同的位元組的地方都顯示出來,若沒有-s,則cmp會預設輸出第一個發現的的不同點。
備註:使用cmp工具可以比較二進位制檔案的不同
學習資料來源於:
http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html