1. 程式人生 > >linux下檔案比較工具diff|cmp使用小結

linux下檔案比較工具diff|cmp使用小結

轉自:http://blog.csdn.net/wangjianno2/article/details/50451737,記錄下便於忘記時查詢。

1.diff

diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。


2.diff使用格式

(1)比較檔案

[plain] view plain copy print ?
  1. diff filename_1 filename_2  
diff filename_1 filename_2
(2)比較目錄

[plain] view plain copy print ?
  1. 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. (1)正常格式(normal diff)  
  2. (2)上下文格式(context diff)  
  3. (3)合併格式(unified diff)  
(1)正常格式(normal diff)
(2)上下文格式(context diff)
(3)合併格式(unified diff)


下面來舉例說明各個格式的形式,假設有兩個檔案f1和f2:

第一個檔案叫做f1,內容是每行一個a,一共7行。

[plain] view plain copy print ?
  1. a  
  2. a  
  3. a  
  4. a  
  5. a  
  6. a  
  7. a  
a
a
a
a
a
a
a
第二個檔案叫做f2,修改f1而成,第4行變成b,其他不變。

[plain] view plain copy print ?
  1. a  
  2. a  
  3. a  
  4. b  
  5. a  
  6. a  
  7. a  
a
a
a
b
a
a
a
(1)正常格式

現在對f1和f2進行比較:

[plain] view plain copy print ?
  1. diff f1 f2  
diff f1 f2
這時,diff就會顯示正常格式的結果:

[plain] view plain copy print ?
  1. 4c4  
  2. < a  
  3. ---  
  4. > 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)。

[plain] view plain copy print ?
  1. diff -c f1 f2  
diff -c f1 f2
顯示結果如下:

[plain] view plain copy print ?
  1. *** f1  2012-08-29 16:45:41.000000000 +0800  
  2. --- f2  2012-08-29 16:45:51.000000000 +0800  
  3. ***************  
  4. *** 1,7 ****  
  5.  a  
  6.  a  
  7.  a  
  8. !a  
  9.  a  
  10.  a  
  11.  a  
  12. --- 1,7 ----  
  13.  a  
  14.  a  
  15.  a  
  16. !b  
  17.  a  
  18.  a  
  19.  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)。

[plain] view plain copy print ?
  1. diff -u f1 f2  
diff -u f1 f2
顯示的結果如下:

[plain] view plain copy print ?
  1. --- f1  2012-08-29 16:45:41.000000000 +0800  
  2. +++ f2  2012-08-29 16:45:51.000000000 +0800  
  3. @@ -1,7 +1,7 @@  
  4.  a  
  5.  a  
  6.  a  
  7. -a  
  8. +b  
  9.  a  
  10.  a  
  11.  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 ?
  1. #步驟一:製作補丁包patch  
  2. diff -Naur passwd.old passwd.new > passwd.patch  
  3. #步驟二:升級  
  4. patch -p0 < passwd.patch  
  5. #步驟三:還原  
  6. 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 ?
  1. 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