導航:首頁 > 操作系統 > Linux打patch

Linux打patch

發布時間:2024-06-15 19:04:41

Ⅰ 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 鎵撹ˉ涓併
榪欓噷鐨勮礬寰勬庝箞瀹氬氨瑕佺湅浣犳妸浣犵殑琛ヤ竵鏂囦歡鏀懼湪浠涔堢洰褰曚簡銆

Ⅱ 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

測試過程

Ⅲ 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相關的資料

熱點內容
用演算法控制玩家的行為 瀏覽:478
androidsdk17下載 瀏覽:792
怎麼給單獨表格添加密碼 瀏覽:12
下載壓縮密碼 瀏覽:259
android系統上編程 瀏覽:468
單片機模擬i2c從機 瀏覽:236
教育年報系統伺服器如何開啟 瀏覽:840
對稱密鑰加密後的長度 瀏覽:292
微製造編程軟體下載 瀏覽:106
旋住宿酒店用哪個App最好 瀏覽:60
三菱編程中怎麼創建子程序 瀏覽:199
在單片機溫度輸入採集信號有 瀏覽:684
電腦雲伺服器同步 瀏覽:418
方舟生存進化手游版怎麼轉伺服器 瀏覽:89
哪個app可以聽小說 瀏覽:160
網路發送數據如何加密 瀏覽:201
教材完全解讀pdf 瀏覽:820
什麼是多台伺服器 瀏覽:36
菜鳥音樂編輯app哪個好 瀏覽:547
人工魚群演算法matlab 瀏覽:82