Diff和Patch命令

 剛把LFS重頭到尾過了一遍,一會兒過夠了configure->make->make install這三部曲的癮了...sql

在編譯軟件包或者是內核的時候,常常須要根據特定的需求對源代碼文件打補丁,補丁能夠在專門的網站上下載,好比www.kernel.org,也能夠本身製做(前提是技術水平要夠格)。獲得xxx.patch文件後,就須要使用patch命令將其補上,因此應該要會使用patch命令的基本用法;若是要本身生成patch文件,就須要使用diff命令。ide


diff  ==  -  (相似於減號,作差)用來比較兩個文件,輸出它們間的不一樣之處
patch ==  +  (相似於加號,作和)將包含兩文件差別部分的文件附加到原始文件上,產生新文件
 
舉例說明:
  
  
           
  
  
  1. root@hdp0:patch# nl A 
  2.      1  00000 
  3.      2  00000 
  4.      3  00000 
  5. root@hdp0:patch# nl B 
  6.      1  11111 
  7.      2  00000 
  8.      3  00000 
A和B兩個原始文件,A是舊文件,B是新文件
 
  
  
           
  
  
  1. root@hdp0:patch#diff -rNu A B > C 
  2. root@hdp0:patch# nl C 
  3.      1  --- A   2011-07-27 21:35:32.977011747 +0800 //-號表示舊文件,其後是A的詳細信息
  4.      2  +++ B   2011-07-27 21:35:43.644398050 +0800 //+號表示新文件,其後是A的詳細信息
  5.      3  @@ -1,3 +1,3 @@ //@@之間表示差別塊,-1,3表示A的內容是3行,有刪除,+1,3表示B的內容是3行,要增長
  6.      4  -00000 //00000這行刪除
  7.      5  +11111 //增長11111這行
  8.      6   00000 
  9.      7   00000 
能夠看到使用diff命令後生成的C文件內容,C文件就能夠算一個使A變爲B的patch文件。
其中diff的3個參數的意義是:
  -r 對目標文件或者目錄遞歸對比
  -N 在對比時,僅出現一次的文件在對應的文件那裏表示爲空文件
  -u 使用詳細的對比信息顯示
PS:這裏要注意,diff命令中的A,B是區分新舊的,產生的C文件只是針對舊文件A的,意思是patch命令只能用C把A變成B,而不能使B變成A。
 
  
  
           
  
  
  1. root@hdp0:patch# patch -Np0 -i C 
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  11111 
  5.      2  00000 
  6.      3  00000 
從上面的結果中能夠看見A已經變成B了。系統會自動根據C中的信息,選擇更新的目標,在patch命令中並不須要指定使用補丁的目標文件。
其中patch的選項的意義是:
  -Np0 N表示注意空文件和是否已經打過補丁,而p0表示搜索補丁的目標文件時直接使用C中包含的A文件路徑。p1則表示從C中包含的A文件路徑的次級目錄搜索。這個和使用diff命令時的狀態有關係。
  -i 後接補丁文件,若是沒有-i,則須要使用 < 符
 
若是打完補丁後以爲不合適,還能夠撤銷補丁,也就是將B再變回A
  
  
           
  
  
  1. root@hdp0:patch# patch -RE -p0 -i C //RE參數決定了回溯效果
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  00000 
  5.      2  00000 
  6.      3  00000 
內容又變爲原始的A文件了。
相關文章
相關標籤/搜索