用 diff 工具可以將兩個檔案的差異性輸出成一個補丁檔。有了這個補丁檔,我們可以利用 patch 工具幫助我們從舊檔案升級成新檔案,或者從新檔案還原成舊檔案。所以 diff 和 patch 搭配在一起,威力無窮啊。
首先我們要做個小實驗,準備兩個文字檔叫做 old 和 new,檔案內容分別如下
old
1
2
3
4
5
6
new
1
3
4
a
b
c
d
然後透過 diff 工具將檔案內容的差異輸出到 sample.patch中,並且觀察一下 patch 裡面的內容。
diff old new > sample.patch
cat sample.patch
2d1
< 2
5,6c4,7
< 5
< 6
---
> a
> b
> c
> d
> (great than) : 代表 add this line
< (less than): 代表 remove this line
2d1: d 就是 delete,舊檔案第二行會被刪除,在新檔案會從第一行開始
5,6c4,7: c 就是 change,舊檔案第五行到第六行,由新檔案第四行到第七行做取代
另外可以參考diff manual,裡頭有許多得參數可以選擇,另一種我覺得滿容易讀的 diff 格式是這樣的。也就是將兩個檔案做合併的輸出,用 - + 還代表資料的減少與增加。
diff -u old new > sample.patch
cat sample.patch
--- old 2012-09-11 08:56:48.391460791 +0800
+++ new 2012-09-10 18:12:03.929122844 +0800
@@ -1,6 +1,7 @@
1
-2
3
4
-5
-6
+a
+b
+c
+d
其實對於這些 diff 的符號有點概念就可以了,畢竟這些符號是寫給電腦看的,不是給人看的。我們有了這個 patch 檔案,就可以輕鬆在舊檔案升級成新檔案,或是新檔案還原成舊檔案。
常用參數
-b:如果一行當中,僅有多個空白的差異,則視為相同-B:忽略空白行的差異
-i:忽略大小寫的差異
升級
patch old sample.patch orpatch -p0 < sample.patch
還原
patch -R new sample.patch orpatch -R -p0 < sample.patch
目錄的diff
diff有很多功能平時我們不常用到,最常用的功能莫過於生成目錄的patch檔了:diff -urN old/ new/ > my.patch
參數 -u 表示使用 unified 格式,-r 表示比較目錄,-N 表示將不存在的檔當作空檔處理,這樣新添加的檔也會出現在patch檔
然後在需要應用patch的地方使用下述命令即可:
patch -p0 < my.patch
沒有留言:
張貼留言