使用diff同patch工具

Linux命令使用

在給客戶提供技術支持工作的時候,常會遇到需要修改各種不同的配置文件。過去的方式,通常是描述修改的地方,然后由用戶自行修改,或使用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

(0)
FelixFelix
上一篇 2018-07-14 18:26
下一篇 2018-07-14 20:41

相關推薦

  • 隨堂筆記2

    記馬哥Linux運維課程第二周知識點(持續更新中)   bin目錄 存放二進制數據 給普通用戶執行的 在Centos7上 綠色的為… 并不是真正的文件夾 而是快捷方式 bin->usr/bin 內容放在一起 ;在6上,這兩者并不是同一個目錄,分開放 sbin 給管理員執行的二進制程序 media mnt(mount) 充當外圍設備…

    Linux筆記 2018-07-29
  • at和crontab命令簡述

      at用于計劃任務的執行,不過只能執行一次: 1 確定時間 at time 2 確定時刻想要執行的內容 command …     crontab 也用于執行計劃任務,可以設定確定的時間多次執行計劃任務,時間精確的分鐘,可將計劃任務按照規定的格式寫入配置文件內,配置文件分為六個字段,分別是:分 時 日 月 周 要執…

    Linux筆記 2018-04-08
  • CentOS6中的mysql及基本用法

    mysql數據庫摘要

    2018-06-05
  • 第八周作業

    1、簡述systemd的新特性及unit常見類型分析,能夠實現編譯安裝的如nginx\apache實現通過systemd來管理
    2、描述awk命令用法及示例(至少3例)
    3、描述awk函數示例(至少3例)

    Linux筆記 2018-06-29
  • redis

    分布式存儲一定是每個節點只存儲一部分數據。

    2018-07-20
  • LINUX基礎–組及用戶

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 2、編輯/etc/group文件,添加組hadoop。 3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home/hadoop。 4、復制/etc/sk…

    2018-03-27
欧美性久久久久