歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux系統補丁工具patch AND diff

Linux系統補丁工具patch AND diff

日期:2017/2/28 14:38:30   编辑:Linux教程

Linux系統補丁工具patch AND diff

一、工具概述:

diff制作補丁的工具

diff後面可以接兩個文件名或兩個目錄名生成補丁

patch打補丁的工具

Patch用途:根據原文件和補丁文件生成目標文件

在數學上來說,diff類似於對兩個集合的差運算,patch類似於對兩個集合的和運算。diff比較兩個文件或文件集合的差異,並記錄下來,生成一個diff文件,這也是我們常說的patch文件,即補丁文件。 patch能將diff文件運用於原來的兩個集合之一,從而得到另一個集合。
舉個例子來說文件A和文件B,經過diff之後生成了補丁文件C,那麼這個過程相當於 |A –B| = C ,那麼patch的過程就是B + C = A 或A - C = B(A + C = B或者B – C = A)。因此我們只要能得到A, B, C三個文件中的任何兩個,就能用diff和patch這對工具生成另外一個文件。這就是diff和patch的妙處。

補丁Patch是天才程序員、Perl的發明者Larry Wall發明的,它應高效地交流程序源代碼之需求而生,隨著以Linux為代表的開發源代碼運行的蓬勃發展,patch這個概念已經成為開放源代碼發起者、貢獻者和參與者的集體無意識的一部分。patch只包含了對源代碼修改的部分,這對於開放源代碼社區的協同開發模式具有重要意義,意味的軟件新版本的發布和對軟件的缺陷或改進可以以更小的文件發布,可以減少網絡的傳輸量,方便軟件維護者的管理工作。
patch文件有多種格式,不同平台上所支持的格式不盡相同,但最常見的是context格式和unified格式。context格式被廣泛使用,是 patch文件格式事實上的標准。該格式包含了差異部分及其鄰近的若干行,鄰近就是所謂的上下文,這些行雖然沒有變化,但它們出現在patch文件使得還原patch的程序具備更強的容錯性。unified格式常見於GNU的patch實現,以patch形式發布的linux內核就使用了該格式。
此外,還有其它比較少用的格式,如Normal格式,並排對比模式(side-by-side),ed script和RCS script模式
等。除了並排對比模式方便用戶觀察文件差異,其它格式大多數是為了兼容舊的patch格式。
二、工具的用法
1、 diff的用法
diff後面可以接兩個文件名或兩個目錄名生成補丁,例如:
diff [option] oldfile newfile
如果是一個目錄名加一個文件名,那麼只作用在那麼個目錄下的同名文件。例如:
diff /usr/xu mine
把目錄/usr/xu 中名為mine的文件與當前目錄中的mine文件進行比較。
Diff常用的option選項有:
l -r 比較目錄時,進行遞歸比較,用於產生整個代碼樹的patch
l -u 輸出統一格式,diff有"傳統"和"統一"兩種格式,現在一般使用"統一"格式,比較而言,統一格式生成的文件大,但包含了更多的信息,有利於閱讀與定位
l -N 表示如果文件不存在則將其等價為空文件,這個用於產生有文件增加或刪除的patch
l -a 補丁中包含二進制文件缺省時,diff向標准輸出打印,所以一般都重定向到文件並以patch為後綴,也就是所謂的補丁文件。關於二進制文件的說明:binary文件可以原始方式存入patch文件。diff可以生成(加-a選項),patch也可以識別。如果覺得這樣的patch文件太難看,解決方法之一是用uuencode處理該binary文件。
如果是兩個目錄的話,作用於該目錄下的所有文件,不遞歸。如果我們希望遞歸執行,需要使用-r參數。不加任何參數生成的diff文件格式是一種簡單的格式,這種格式只標出了不一樣的行數和內容。我們需要一種更詳細的格式,可以標識出不同之處的上下文環境,這樣更有利於提高patch命令的識別能力。這個時候可以用-c開關。可以參考表1 diff的命令行選項和參數。
diff的命令行選項和參數:
-a 將所有的文件看作文本,既使文件看起來像是二進制的也不例外,並且進行逐行比較【二進制文件必須加上這個參數】
-b 忽略塊中空白數目的改變
-B 忽略插入或刪除空行造成的改變
-c 產生"上下文"(context)格式的輸出
-C[num] 產生"上下文"(context)格式的輸出,顯示塊前後num行的內容,如果不指定num的值,則顯示塊前後3行的內容
-H 修改diff處理大文件的方式
-i 忽略大小寫
-I regexp 忽略插入或刪除與正則表達式regexp匹配的行
-l 將輸出結果通過pr命令處理加上頁碼
-p 顯示出現塊的C函數
-q 只報告文件是否不同;不輸出差別
-r 比較目錄時,進行遞歸比較,用於產生整個代碼樹的patch
-s 報告兩個文件相同(默認的行為是不報告相同的文件)
-t 輸出時tab擴展為空白
-u 產生"統一"(unified)格式的輸出
-U[num] 產生"統一"(unified)格式的輸出,顯示塊前後num行的內容,如果不指定num的值,則顯示塊前後3行的內容
-v 打印diff的版本號
-w 逐行比較時忽略空白
-W cols 如果產生並排格式的輸出(參見-y),讓輸出的每一列有cols個字符寬
-x pattern 當比較目錄時,忽略匹配模式pattern的任何文件和子目錄
-y 產生並排格式的輸出
-N 表示如果文件不存在則將其等價為空文件,這個用於產生有文件增加或刪除的patch

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-11/92908p2.htm

Copyright © Linux教程網 All Rights Reserved