在給客戶提供技術支持工作的時候,常會遇到需要修改各種不同的配置文件。過去的方式,通常是描述修改的地方,然后由用戶自行修改,或使用sed等工具寫 一個腳本給用戶運行。但這樣會帶來一些問題:如果用戶不會vi,或者他理解錯、找錯配置的位置,這樣帶來的問題可能更難預計。
此時,或許可以試試我的方法,借用diff和patch直接幫用戶修改,然后把生成的“patch補丁”發給他運行即可。這樣工作量小,而且也能控制修改后的結果,當然也方便Email發送咯。
一、介紹
diff 和patch是一對工具,在數學上來說,diff是對兩個集合的差運算,patch是對兩個集合的和運算。diff比較兩個文件或文件集合的差異,并記錄 下來,生成一個差異文件,這也是我們常說的補丁文件。補丁文件能運用于原來的兩個集合之一,從而得到另一個集合。
舉個例子來說文件A和文件B,經過diff之后生成了補丁文件C,那么著個過程相當于 A -B = C ,那么patch的過程就是B+C = A 或A-C =B。
因此我們只要能得到A, B, C三個文件中的任何兩個,就能用diff和patch這對工具生成另外一個文件。
二、使用
實例說明是最快的方法,假設現在有a、b兩個文件,內容如下:
引用
$ cat a
123456
$ cat b
abcdef
其中a是用戶發給我的文件,而b是我修改后的文件。
那我們可以這樣生成c文件:
$ diff -Naur a b > c
然后,可以把c文件發給用戶,運行如下的命令即可自行修改a->b:
$ patch -p0 a < c
patching file a
結果如下:
$ cat a
abcdef
三、恢復
上面的操作很簡單吧。那如果萬一a修改有誤,如何恢復呢?通過前面的說明可以知道,通過c文件是可以直接恢復的:
引用
$ patch -R -p0 a < c
patching file a
$ cat a
123456
可以看到使用diff和patch是比較安全的,請注意-R選項哦!
另外,diff生成的c文件是有記錄文件名的,在不指定原文件的情況下,可以自動識別:
$ patch -p0 < c
patching file a
反了會這樣:
$ patch -p0 b < c
patching file b
Reversed (or previously applied) patch detected! Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
1 out of 1 hunk ignored — saving rejects to file b.rej
所以,一般是不會搞錯新舊文件的。
四、路徑問題
很多時候,我們還會遇到一個問題。就是為了防止文件修改錯,或需要同時修改多個文件,可能會建立多一層目錄,例如:
引用
$ ls -R
.:
new old
./new:
b
./old:
a
diff是可以識別路徑:
$ diff -Naur old/ new/ > c
補丁需要這樣打:
$ cd old/
$ patch -p1 < ../c
patching file a
patching file b
結果如下:
引用
$ ls
b
$ cat b
abcdef
※注意咯,這樣會把整個目錄的文件內容和文件名都改掉的。另外,如果目錄中有多個文件,除了new目錄中的空文件外,會把old下的所有文件都換成new的文件和內容;new沒有,而old有的文件,會刪除。
引用
-pN參數的意思是:取消N層目錄,也就是把old/改為./
五、注意事項
引用
1、在patch之前不要對原文件進行任何修改,否則補丁可能會失效;
2、如果做了多個補丁,請注意先后順序,要按次序打才行;
3、如果打補丁出現問題,會生成.rej文件,其中包括原文件和補丁差異的地方。
原創地址:http://www.wangchao.net.cn/bbsdetail_1632751.html
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102904