1. 程式人生 > >Shell中檔案比較cmp、diff、patch區別

Shell中檔案比較cmp、diff、patch區別

原文地址:http://blog.csdn.net/shanyongxu/article/details/46868089

檔案比較

所謂的檔案比較,一般設計四個領域

1.檢查兩個檔案是否相同,如果不同,找不哪裡不同

2.應用兩個檔案的不同之處,使從其中一個回覆另外一個

3.使用校驗和找出相同一致的檔案

4.使用數字簽名以驗證檔案

cmpdiff

在文書處理上,最常出現的問題應該是比較兩個或兩個以上的檔案,看看他們的內容是否相同----即便它們的名稱不同.

案例:

$cp /bin/ls /tmp/ls #製作/bin/ls的私用副本

$cmp /bin/ls /tmp/ls #拿原始文字與副本比較

$cmp /bin/cp /tmp/ls #輸出結構指出第一個不同處的位置

/bin/cp /tmp/ls differ: byte 25, line 1

分析:cmp發現兩個引數檔案一致時

,會採用預設的方式.如果你只對他的離開狀態有興趣,可以使用-s選項,抑制警告資訊:

$cmp -s /bin/cp /tmp/ls       #預設的比較兩檔案的不同

$echo $? #顯示離開碼

1 #0,表示兩個檔案不同

cmp命令詳解:

語法:

cmp [選項] [檔案]

主要選項:

-c

除了標明差異處的十進位制字碼之外,一併顯示該字元所對應字元.

-i<字元數目

制定一個數目

-l

顯示出所有不一樣的地方

-s

不顯示錯誤的資訊

-v

顯示版本資訊

注意:在比較結果中,只能夠西顯示第一個不同的比較結果.

如果你想知道兩個檔案有何不同,可使用diff,diff命令是linux上非常重要的命令,用於比較檔案的內容

,特別是比較兩個版本不同的檔案以找到改動的地方.diff在命令列中列印每一行的改動.最新版本的diff還支援二進位制檔案.diff程式的輸出被稱為補丁(patch),因為linux系統中還有一個patch程式,可以根據diff的輸出將a.c的檔案內容更新為b.c . diffsvn,cvs,git等版本控制工具不可或缺的一部分.

diff命令詳解

語法:

diff [選項] [變動前檔案或目錄] [變動後文件或目錄]

功能:

比較單個檔案或目錄的內容.如果指定比較的是檔案,則只有當輸入為文字檔案時才有效.以逐行的方式,比較文字檔案的異同處.如果指定比較的是目錄,diff命令會比較兩個目錄下名字相同的文字檔案

.列出不同的二進位制檔案,公共子目錄和只在一個目錄出現的文字.

主要選項:

-b

不檢查空格字元的不同

-B

不檢查空白行

-w

忽略全部的空格字元

-i

不檢查大小寫的不同

-q

僅顯示有無差異,不顯示詳細的資訊

diff目錄時常用的引數如下:

-r

比較子目錄中的檔案

-N

檔案A僅出現在某個目錄中,預設會顯示:only in目錄,檔案A若使用-N引數,diff會將檔案A與一個空白的檔案比較

-P

-N類似,只有當第二個目錄包含了一個第一個目錄所沒有的檔案時,才會將這個檔案與空白的檔案作比較.

diff有四種格式:

1.正常格式

2.並列格式

3.上下文格式

4.合併格式

正常格式案例:不新增任何引數


$cat f1

a b

b

c

d

e

$cat f2

a b c

b

d

e

f

1c1

< a b

---

> a b c

3d2

< c

5a5

> f

分析:1c1,3d2,5a5是說明變動的位置,前邊數字代表f1中國所變化的行,後面的則代表f2中變化的行,中間的字母分別代表”改變(c)”,”刪除(d)”和”增加(a)

<表示f1指定行的內容,---分割兩個檔案的,然後>表示f2指定行的內容.刪除或增加時,則分別f2,f1中指定行無內容

並列格式diff

其他格式diff都實現後顯式兩個檔案的內容變化,並列格式可以並排顯式兩個檔案的內容變化,更形象的看出檔案的變化,vimdiff顯式的有些類似.

使用方法為加入-y選項,即可並列顯示,-W(大寫) num引數可設定並列的寬度,可以不使用.

$ diff -y -W 50 f1 f2

a b                   | a b c

b                       b

c                     <

d                       d

e                       e

                      > f

說明此行有變化,<說明此行被刪除了,>說明此行是後增加的.

上下文格式diff

標準格式diff顯式的內容不夠直觀,上下文格式則通過顯示變化的上下文,而更加的利於理解.

使用方法是使用引數-c.

案例

$diff -c f1 f2

*** f1  2015-07-13 18:42:50.996380933 +0800

--- f2  2015-07-13 18:43:06.846375746 +0800

***************

*** 1,5 ****

! a b

  b

- c

  d

  e

--- 1,5 ----

! a b c

  b

  d

  e

+ f

分析:首先,顯示兩個檔案的基本情況:

*** f1  2015-07-13 18:42:50.996380933 +0800

--- f2  2015-07-13 18:43:06.846375746 +0800

***表示變動前的檔案f1,---表示變動後的檔案f2

然後15個星號將檔案的基本情況和變動內容分隔開

*** 1,5 ****  表示f1檔案的1-5

--- 1,5 ----    表示f2檔案的1-5

!代表此行內容有變動,+表示新增加的,- 表示此行被刪除了.

上下文格式預設顯示包括修改行前後的三行內容,可以使用-num來設定前後num,:

$diff -C(大寫C) -1(數字1) f1 f2

合併格式diff

兩個檔案大量內容重複,上下文格式顯示很多無用的干擾資訊,後來就推出了合併式diff.

使用方法為,加入-u引數,案例:

$diff -u f1 f2

diff -u f1 f2

--- f1  2015-07-13 18:42:50.996380933 +0800

+++ f2  2015-07-13 18:43:06.846375746 +0800

@@ -1,5 +1,5 @@

-a b

+a b c

 b

-c

 d

 e

+f

分析:同樣前兩行表示兩個檔案的基本情況

然後@@-1,5 +1,5 @@表示修改的位置,-代表f11-5,+代表f21-5.

最後是合併顯示的變動具體內容,依舊是-代表f1,+代表f2.

同上下文格式一樣,合併格式也是預設顯示修改前後三行的內容,可以使用-num來設定顯示前後num:

$diff -u -1 f1 f2 

patch工具程式

patchdiff的輸出重定向到文字檔案中,即得到了補丁檔案(patch),可以使用patch命令對文字檔案或目錄打補丁,從而進行內容更新.

patch詳解

語法:

patch [選項] [補丁檔案]

主要引數:

-p num

忽略幾層資料夾

-E

選項說明如果發生了空檔案,那麼就刪除它

-R

取消打過的補丁

如果使用引數-p0,表示從當前目錄找打補丁的目標資料夾,再對該目錄中的檔案執行patch操作.

而是用引數-p1,表示忽略第一層目錄,從當前目錄需找目標資料夾中的子目錄的檔案,進行patch操作.

處理單個檔案補丁

產生補丁:

$diff -uN f1 f2 > file.patch

打補丁:

$patch -p0 <file.patch

或者

$patch f1 file.patch

取消補丁:

$patch -RE -p0 < file.patch

或者

$patch -RE f1 file.patch

處理檔案補丁

產生補丁:

$diff -urN d1 d2 > dir.patch

打補丁:

$cd d1

$patch -p1 < ../dir.patch

取消補丁:

patch -R -p1 < ../dir.patch

應用補丁時的目的碼和生成補丁時的程式碼未必相同,打補丁的操作可能失敗,補丁失敗的檔案會以.rej結尾.

patch工具程式可利用diff輸出,結合原始檔案,以重建另一個檔案,因為相異的部分,通常比原始檔案小得多,軟體開發人員常會通過email交換相異處的列表,再使用patch應用它.

雖然patch可使用diff的一半輸出,但較通用的當時影視使用diff-c選項,已取得上下文差異處.這麼做會產生較詳細冗長的報告,rangpatch知道檔名,允許他驗證變更位置,並回復不同之處.如果兩個檔案自從差異出已被記錄下來之後都未有修改,則上下文差異功能是不重要的,但是在軟體開發中,時常會有其中之一牽涉其中.

不難看出patch的作用就是為了高效的就留程式原始碼產生的,patch只包含了對原始碼修改的部分.