使用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
下一篇 2018-07-14

相關推薦

  • 第四周作業

    第四周作業
    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。
    2、編輯/etc/group文件,添加組hadoop。
    3、手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home/hadoop。
    4、復制/etc/skel目錄為/home/hadoop,要求修改hadoop目錄的屬組和其它用戶沒有任何訪問權限。
    5、修改/home/hadoop目錄及其內部所有文件的屬主為hadoop,屬組為hadoop。
    6、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式;
    7、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
    8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;
    9、找出/etc/passwd文件中的一位數或兩位數;
    10、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
    11、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;
    12、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行;
    13、添加用戶bash, testbash, basher, nologin (此一個用戶的shell為/sbin/nologin),而后找出當前系統上其用戶名和默認shell相同的用戶的信息;

    2018-06-07
  • 第一周博客(4)

    基礎命令

    Linux筆記 2018-05-12
  • linux系統修復報錯的方法 . 4

    如果/boot目錄下所有的文件都丟了怎么辦

    2018-05-12
  • 文件系統掛載

    一、mount、umount、mount -o remount、findmnt、lsof、fuser
    二、掛載設置ACL權限、模擬U盤功能、losetup
    三、UUID故障處理、分區遷移與恢復、永久掛載光盤分區、掛載USB、永久掛載文件夾
    四、SWAP、掛載光盤、制作ISO鏡像、制作Centos6Everthing
    五、df、du、dd備份/恢復/修復硬盤

    2018-05-26
  • CentOS 7 用戶、組屬性權限管理以及grep命令常見用法

    1.復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶就沒有任何訪問權限 [root@bogon ~]# cp -r /etc/skel /home/tuser1[root@bogon ~]# chmod -R 700 /homw/tuser1[root@bogon ~]# ll /home/tus…

    Linux筆記 2018-06-11
  • 如何刪除大文件并立馬釋放磁盤空間

    我們先用df ?-h發現磁盤空間快滿了,圖1 我們馬上有rm -f /boot/bigfile刪除大文件,發現磁盤并沒有釋放空間 圖2 那我們用這個命令ls /boot來看看到底有沒有刪除 ?圖3 發現確實已經刪掉了,那怎么辦了,我這里有個簡單明了的方法,我們用大于號> /boot/bigfile把文件清空然后再用rm -f /boot/bigfile…

    2018-03-31
欧美性久久久久