網頁

2013年3月26日

diff and patch

Linux 中 Diff 命令的功能為逐行比較兩個文字檔案,列出其不同之處。它對給出的檔進行系統的檢查,並顯示出兩個檔中所有不同的行,不要求事先對檔進行排序。

用 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 or
patch -p0 < sample.patch

還原

patch -R new sample.patch or
patch -R -p0 < sample.patch



目錄的diff

diff有很多功能平時我們不常用到,最常用的功能莫過於生成目錄的patch檔了:
diff -urN old/ new/ > my.patch

參數 -u 表示使用 unified 格式,-r 表示比較目錄,-N 表示將不存在的檔當作空檔處理,這樣新添加的檔也會出現在patch檔

然後在需要應用patch的地方使用下述命令即可:
patch -p0 < my.patch

diff -y 參數

可以將螢幕分成左右兩部分,來比較兩個檔之間的差異。許多圖形化的比較工具都有這個功能,但如果只能使用命令行,這個參數就相當有用了

Reference

沒有留言:

張貼留言