導航:首頁 > 程序命令 > linux常用命令patch

linux常用命令patch

發布時間:2024-04-02 17:54:16

linux命令diff、patch

背景

在Linux系統環境的工作過程中,經常遇到需要對比文件差異的情況,此時,使用Linux提供的diff工具可以方便的發現文件不同版本之間差異,從而快速排除解決問題。

Windows端有強大文件對比工具BeyondCompare。

patch 命令可以將diff命令的輸出應用到原始的對比文件中,將新版本的更新應用到原始的文件中。

命令

diff [option] [file1] [file2]

patch [option] [file1] [file_differ]

測試環境

WSL: Linux PERSONALPC 4.4.0-19041-Microsoft #488-Microsoft Mon Sep 01 13:43:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux

測試過程

Ⅱ Red Hat Enterprise Linux 6 鎬庝箞鎵撹ˉ涓

浣犲彲浠ュ厛鍘諱笅杞戒綘闇瑕佺殑琛ヤ竵鍖(鍖呴噷涓鑸鏈変竴涓琛ヤ竵鏂囦歡鐨勶紝鍥犱負濡傛灉鏈変笉鍚岀殑鐗堟湰錛屽氨鑲瀹氫細鏈夎ˉ涓佺殑錛夛紝鐒跺悗鐢ㄥ懡浠わ細patch 鍛戒護鎵撳寘灝辮屼簡銆傚叿浣撶敤娉曞備笅錛
patch -p[num] <patchfile
"patchfile"鏄浣犱笅杞界殑琛ヤ竵鏂囦歡錛屽湪榪欎釜琛ヤ竵鏂囦歡閲屼竴鑸閮芥湁瑕佺粰閭d釜鏂囦歡鎵撹ˉ涓佺殑璺寰勶紝
濡傦細/u/howard/src/blurfl/blurfl.c 灝辨槸緇檅lurfl.c鎵撹ˉ涓侊紱
鑰 -p[num]鐨勪綔鐢ㄥ氨鏄鍘繪帀榪欎釜璺寰勭殑絎鍑犱釜鈥/鈥滃墠鐨勫唴瀹癸紝
濡傦細patch -p1 <patchfile 灝辨槸緇檜/howard/src/blurfl/blurfl.c 鎵撹ˉ涓侊紝
patch -p4 <patchfile 灝辨槸緇檅lurfl/blurfl.c 鎵撹ˉ涓併
榪欓噷鐨勮礬寰勬庝箞瀹氬氨瑕佺湅浣犳妸浣犵殑琛ヤ竵鏂囦歡鏀懼湪浠涔堢洰褰曚簡銆

Ⅲ diff命令和patch命令的使用

diff 命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中列印每一個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱為補丁 (patch),因為Linux系統中還有一個patch程序,可以根據diff的輸出將a.c的文件內容更新為b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。

diff命令的格式一般為:

diff [參數][文件或者目錄1][文件或者目錄2]

例如,有文件凱豎歷test1和test2:

將會輸出:

格式的含義如注釋所示。

diff 的normal 顯示格式有三種提示:

a - add

c - change

d - delete

比較常用的是以合並的方式顯示兩個文件的不同:

輸出如:

這種輸出方式輸出的內容可以用於使用patch命令進行打補丁包。patch命令我們稍後再看。

diff命令也可以比較兩個文件夾的不同:

例如有兩個文件夾testa和纖嫌test,將test1和test2放進去:

得到:

第一部分是文件的信息

"---"表示變動前的文件,"+++"表示變動後的文件。

第二部分表示變動的位置

@@ -1,11 +1,5 @@

減號表示第一個文件,後面的表示第一行起一共11行。加號表示第二個文件。後面是第一行起一共5行。

接下來的表示區別的部分。

例如:

將得到:

這種模式中

「|」表示前後2個文件內容有不同

「<」表示後面文件比前面文件少了1行內容

「>」表示後面文件比前面文件多了1行內容

我們可以先用diff命令生成patch文件。然後使用patch命令將第二盯搜個文件內容修改成第一個文件的內容。

例如上述的test1和test2:

之後test2的內容就會和test1內容一致了。

svn diff生成的patch也可以用於更新文件

Ⅳ linux下的patch命令

patch命令用於為特定軟體包打補丁,該命令使用diff命令對源文件進行操作。

格式:patch [選項] [原始文件 [補丁文件]]
常用參數:
-r 是一個遞歸選項,設置了這個選項,diff會將兩個不同版本源代碼目錄中的所有對應文件全部都進行一次比較,包括子目錄文件。
-N 選項確保補丁文件將正確地處理已經創建或刪除文件的情況。
-u 選項以統一格式創建補丁文件,這種格式比預設格式更緊湊些。
-p0 選項從當前目錄查找目的文件(夾)(直接使用補丁文件裡面指定的路徑)
-p1 選項忽略掉第一層目錄,從當前目錄查找(去掉補丁文件指定路徑最左的第1個'/'及前面所有內容)。
-E 選項說明如果發現了空文件,那麼就刪除它
-R 選項說明在補丁文件中的「新」文件和「舊」文件現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)

示例:
1、單個文件
首先將兩個文件的內容顯示如下:
$ cat test0
00000000
00000000
00000000
$ cat test1
00000000
11111111
00000000

*生成補丁:
$ diff -uN test0 test1 >test1.patch
這樣將通過比較,生成test1的補丁文件。這里選項u表示使用同一格式輸出這樣產生的輸出便於閱讀易於修改,N表示把不存在的文件看做empty的.就算文件test0不存在,也會生成補丁。

*把test0通過打補丁變成test1文件:
$ patch -p0 <test1.patch
或$patch <test1.patch
這樣,test0的內容將和test1的內容一樣,但是文件名稱還是test0。關於patch的選項見後面多文件有說明。當前目錄下可以有test1.如果比較的時候test0是不存在的,那麼這時候會生成一個test0文件。

*把打過補丁的test0還原:
$ patch -RE -p0<test1.patch
或$patch -R <test1.patch
這樣,test0的內容將還原為原來沒有打過補丁的狀態。當前目錄下可以有test1.這里的-E選項是要求patch在文件為空的時候刪除文件,這個選項是不必要的因為patch是根據時間戳來判斷一個文件是否存在。如果比較的時候test0是不存在的,這將會刪除test0文件。
**

2、多個文件的:
首先查看文件結構如下:
1)外層目錄列表:
$ ls -p
prj0/ prj1/

2)子目錄prj0列表:
$ ls -p prj0
prj0name test0

3)子目錄prj1列表:
$ ls -p prj1
prj1name test1

4)文件prj0/prj0name:
$ cat prj0/prj0name
--------

prj0/prj0name

--------

5)文件prj1/prj1name:
$ cat prj1/prj1name
---------

prj1/prj1name

---------

6)文件prj0/test0:
$ cat prj0/test0
0000000
0000000
0000000
0000000
0000000
0000000
0000000

7)文件prj1/test1:
$ cat prj1/test1
1111111
1111111
1111111
1111111
1111111
1111111
1111111

*創建補丁:
$ diff -uNr prj0 prj1 > prj1.patch
這里項u表示使用同一格式輸出這樣產生的輸出便於閱讀易於修改,N表示把不存在的文件看做empty的,r表示遞歸地比較子目錄,比較的結果被標准重定向到文件prj1.patch中了。
運行之後,輸出的就是一個補丁,描述了兩個文件的不同,這個補丁就是把diff參數的第一個文件打補丁變成第二個文件的補丁文件。
實際過程依次比較兩個目錄下的同名文件,如果這里不加-N就會指明prj0name和test0隻在prj0中存在,prj1name和test1隻在prj1中存在,這就無法比較了,所以這里為了能夠比較,加上了-N選項。
為了便於理解,這里給出prj1.patch文件的內容:
$ cat prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name 2009-08-24 10:44:19.000000000 +0800
+++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800
@@ -1,5 +0,0 @@
---------
-
-prj0/prj0name
-
---------
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name 2009-08-24 10:45:05.000000000 +0800
@@ -0,0 +1,5 @@
+---------
+
+prj1/prj1name
+
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test0 2009-08-24 11:21:12.000000000 +0800
+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800
@@ -1,7 +0,0 @@
-0000000
-0000000
-0000000
-0000000
-0000000
-0000000
-0000000
diff -uNr prj0/test1 prj1/test1
--- prj0/test1 1970-01-01 08:00:00.000000000 +0800
+++ prj1/test1 2009-08-24 11:21:33.000000000 +0800
@@ -0,0 +1,7 @@
+1111111
+1111111
+1111111
+1111111
+1111111
+1111111
+1111111

*將prj0中的所有文件打補丁成為prj1中的所有文件:
步驟如下:
1)$ cp prj1.patch ./prj0
2)$ cd prj0
3)$ patch -p1 < prj1.patch
這里,把補丁文件復制到了prj0下面,然後將該文件夾下面的文件"變成"prj1下的文件了.
$ ls -p
prj1name prj1.patch test1
關於patch命令的-p選項接數字n,意思是去掉補丁文件里指定路徑的前n個'/'前綴.
例如補丁文件中指定路徑是/u/howard/src/blurfl/blurfl.c,那麼p0選項處理之後的路徑還是原來路徑不變,而p1選項處理之後的路徑是u/howard/src/blurfl/blurfl.c,同理p4處理之後的路徑是:blurfl/blurfl.c.
注意:如果在外層目錄運行這個命令,那麼會在外層目錄創建兩個prj1name和test1文件。

*將打好補丁的prj0中的所有文件還原成為原來打補丁之前的文件:
$ patch -R -p1 < prj1.patch
運行之後文件變成原來的文件了,如下:
$ ls -p
prj0name prj1.patch test0

*將prj1中的所有文件反向打補丁成為prj0中的所有文件:
$ patch -R -p1 < prj1.patch
運行之後prj1中的文件變成prj0的文件了,如下:
$ ls -p
prj0name prj1.patch test0

*將prj1中反打補丁後的文件還原成原來的prj1中的文件:
$ patch -p1 < prj1.patch
運行之後,prj1中的文件被還原了,如下:
$ ls -p
prj1name prj1.patch test1

*在外層目錄把prj0的內容打補丁成prj1的內容:
$ls -p
prj0/ prj1.patch
$patch -p0 <prj1.patch
這樣prj0中的內容變成了prj1中的內容,但是prj0的目錄名仍舊是prj0,如下:
$ls -p prj0
prj1name test1
注意:當前文件夾下面不能prj1目錄,否則會出現一些警告提示。

*在外層目錄把prj0的內容反打補丁還原成原來prj0的內容:
$ patch -R -p0 <prj1.patch
這樣原來的文件如下:
$ ls -p prj0
prj0name test0
**

Ⅳ linux怎麼運行patch

通過diff工具生成補丁, patch工具打上補丁.在使用diff之前, 你需要保留一份未修改過的源碼, 然後在其它地方修改源碼的一份拷貝. diff對比這兩份源碼生成patch. 修改過的源碼必須保留原來的文件名, 例如, 如果你修改源碼中的a.c文件, 那麼, 修改後的文件還是名為a.c, 在修改之前你可以復制a.c為a.orig.c進行備份.
diff命令必須在整個Linux源碼的根目錄的上一級目錄中執行.
1. 為單個文件生成補丁
diff -up linux-2.6.28.8/net/sunrpc/svc.orig.c linux-2.6.28.8/net/sunrpc/svc.c
這條命令會產生類似如下的輸出, 你將它重定向到一個文件中, 這個文件就是patch.
--- linux-2.6.28.8/net/sunrpc/svc.orig.c 2009-03-17 08:50:04.000000000 +0800
+++ linux-2.6.28.8/net/sunrpc/svc.c 2009-03-30 19:18:41.859375000 +0800
@@ -1050,11 +1050,11 @@ svc_process(struct svc_rqst *rqstp)
參數詳解:
-u 顯示有差異行的前後幾行(上下文), 默認是前後各3行, 這樣, patch中帶有更多的信息.
-p 顯示代碼所在的c函數的信息.

Ⅵ 如何運用linux 的基本命令,repo/git 的基本命令 > 本地生成一個patch

patch命令用於為特定軟體包打補丁,該命令使用diff命令對源文件進行操作。 格式:patch [選項] [原始文件 [補丁文件]] 常用參數: -r 是一個遞歸選項,

Ⅶ linux下的patch命令,該怎麼處理

patch 命令用於打補丁,補丁文件是使用diff產生的 patch 命令語法 patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ ...

閱讀全文

與linux常用命令patch相關的資料

熱點內容
coreutilslinux 瀏覽:797
安卓手機原創許可權怎麼申請 瀏覽:922
試卷收納文件夾高中 瀏覽:232
火星一線加密貨幣分叉圖 瀏覽:923
可編程式控制制器標准 瀏覽:311
介紹程序員英語 瀏覽:466
網路加密伺服器有什麼作用 瀏覽:260
蘋果手機pdf怎麼保存 瀏覽:982
編譯器語法大嗎 瀏覽:27
隱私加密的分類 瀏覽:23
endnote文件直接放入文件夾 瀏覽:743
androidcamera幀率 瀏覽:65
飢荒官方伺服器怎麼初始化 瀏覽:579
蠟筆小新媽媽壓縮棉被子 瀏覽:603
pdf單頁保存 瀏覽:938
拼車小程序源碼gitlab 瀏覽:575
華為機器控制演算法專業碩士工薪 瀏覽:84
程序員游戲出包 瀏覽:29
天雲游app怎麼下載 瀏覽:262
utf8不可映射字元無法編譯 瀏覽:505