shell學習四十七天----檔案比較cmp,diff,patch
轉載地址:http://blog.csdn.net/shanyongxu/article/details/46868089
檔案比較
所謂的檔案比較,一般設計四個領域
1.檢查兩個檔案是否相同,如果不同,找不哪裡不同
2.應用兩個檔案的不同之處,使從其中一個回覆另外一個
3.使用校驗和找出相同一致的檔案
4.使用數字簽名以驗證檔案
cmp和diff
在文書處理上,最常出現的問題應該是比較兩個或兩個以上的檔案,看看他們的內容是否相同----即便它們的名稱不同.
案例:
$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 . diff是svn,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 @@表示修改的位置,-代表f1的1-5行,+代表f21-5行.
最後是合併顯示的變動具體內容,依舊是-代表f1,+代表f2.
同上下文格式一樣,合併格式也是預設顯示修改前後三行的內容,可以使用-num來設定顯示前後num行:
$diff -u -1 f1 f2
patch工具程式
patch將diff的輸出重定向到文字檔案中,即得到了補丁檔案(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只包含了對原始碼修改的部分.