2021-05-12 14:32:11
Linux下打修補程式patch 和 diff 命令的使用
Q:為什麼要找不同,為什麼要打修補程式?
A:
在Linux應用中,作為DBA,我們知道MySQL跑在Linux系統之上,資料庫最重要的追求就是效能,“穩”是重中之重,所以不能動不動就是換系統或是換這換那的,這個時候除非是萬不得已,要不然都是在原有基礎上改改就行了,也就是給核心及下載的一些原始碼打修補程式或者說是升級,那麼在Linux下使用diff製作修補程式以及如何使用patch打修補程式顯得尤為重要。
一、找不同:diff命令(differences)
-- compare files line by line
一行一行的比較文字檔案
作用:
比較兩個檔案之間的差異,輸出結果為兩個檔案的不同之處。
使用diff命令製作修補程式。
格式:
diff [OPTION]... FILES
選項:
-u:會將不同的地方放在一起,緊湊易讀
diff -u linuxidc.com1 test2 > test.patch (利用diff命令生成修補程式patch)
-r:遞回比較目錄下的所有檔案(比較資料夾時候一定要接-r)
1、diff命令:找不同
shell> cp fruit.txt shuiguo.txt
shell> diff fruit.txt shuiguo.txt
//因為是複製的檔案,所以檔案內容沒有差異,也就沒有輸出結果
shell> echo "banana" >>fruit.txt
shell> diff fruit.txt shuiguo.txt
9d8
< banana
//diff命令後面,第一個檔案有9行,第二個檔案有8行,<表示右邊檔案內容缺失
shell> echo "cherry" >>shuiguo.txt
shell> diff fruit.txt shuiguo.txt
9c9
< banana
---
> cherry
//diff命令後面,兩個檔案都是9行,<右邊檔案缺失banana,>左邊檔案缺失cherry
2、diff命令:製作修補程式檔案
shell> cat ni.txt
jinan
changqing
linux
chinaitsoft
shell> cp ni.txt wo.txt
shell> diff ni.txt wo.txt
shell> diff -u ni.txt wo.txt
//copy檔案沒有內容差異
shell> echo "zhangjiacai" >>wo.txt
shell> diff -u ni.txt wo.txt
--- ni.txt 2016-11-02 16:11:35.253976996 +0800
+++ wo.txt 2016-11-02 16:13:50.037971397 +0800
@@ -2,3 +2,4 @@
changqing
linux
chinaitsoft
+zhangjiacai
shell> vim ni.txt
shell> cat ni.txt
jinan
linux
chinaitsoft
shell> diff -u ni.txt wo.txt
--- ni.txt 2016-11-02 16:16:32.930978061 +0800
+++ wo.txt 2016-11-02 16:13:50.037971397 +0800
@@ -1,3 +1,5 @@
jinan
+changqing
linux
chinaitsoft
+zhangjiacai
解析:
@@ 代表一段範圍
- 代表ni.txt
+ 代表wo.txt
使用 > 輸出重定向生成修補程式檔案ni-to-wo.patch
shell> diff -u ni.txt wo.txt > ni-to-wo.patch
shell> cat ni-to-wo.patch
--- ni.txt 2016-11-02 16:16:32.930978061 +0800
+++ wo.txt 2016-11-02 16:13:50.037971397 +0800
@@ -1,3 +1,5 @@
jinan
+changqing
linux
chinaitsoft
+zhangjiacai
如此,我們就做好了一個修補程式檔案。
二、打修補程式:patch命令
--- apply a diff file to an original.
用途:
用來打修補程式---修補檔案
格式:
patch [選項] 原始檔案 < 修補程式檔案
-pN:N表示忽略N層路徑
-R: 還原到老版本
注意事項:
①如果打多個修補程式,注意先後順序;
②打修補程式前不要修改原始檔;
1、檔案和檔案的比較
shell> diff ni.txt wo.txt
1a2
> changqing
3a5
> zhangjiacai
shell> diff ni.txt wo.txt >ni-to-wo.patch //生成修補程式檔案
shell> patch ni.txt <ni-to-wo.patch //打修補程式
patching file ni.txt
shell> diff ni.txt wo.txt //打修補程式成功
shell> patch -R ni.txt <ni-to-wo.patch //還原到原來的版本(復原打修補程式)
patching file ni.txt
shell> diff ni.txt wo.txt
1a2
> changqing
3a5
> zhangjiacai
2、目錄和目錄的比較
[root@localhost linuxidc.com]# tree qq-v1
qq-v1
├── hosts
└── image
└── 1.txt
[root@localhost linuxidc.com]# tree qq-v2
qq-v2
├── hosts
├── image
│ └── 1.txt
├── passwd
└── sound
└── 3.txt
[root@localhost linuxidc.com]# diff -ur qq-v1 qq-v2
Only in qq-v2: passwd
Only in qq-v2/sound: 3.txt
[root@localhost linuxidc.com]# diff -Nur qq-v1 qq-v2
diff -Nru qq-v1/passwd qq-v2/passwd
--- qq-v1/passwd 1970-01-01 08:00:00.000000000 +0800
+++ qq-v2/passwd 2016-11-02 17:07:47.664980339 +0800
@@ -0,0 +1,31 @@
+root:x:0:0:root:/root:/bin/bash
+bin:x:1:1:bin:/bin:/sbin/nologin
解析:
-N --new-file(Treat absent files as empty)如果沒有檔案,就拿一個空檔案和別的目錄裡的檔案比較
製作修補程式檔案進行對目錄的打修補程式
[root@localhost linuxidc.com]# diff -Nur qq-v1 qq-v2 >patch-v2.txt #比較資料夾生成修補程式檔案--備用:修補程式檔案patch-v2.txt在linuxidc.com目錄下
-pnum or --strip=num
Strip the smallest prefix containing num leading slashes from each file name
found in the patch file.
例如:/a/b/c/d/e/f/g
-p3 的效果就是去掉第3個/前面的內容,效果:c/d/e/f/g
-p4 的效果就是去掉第4個/前面的內容,效果:d/e/f/g
1> 內層打修補程式
[root@localhost linuxidc.com]# cd qq-v1 #進入qq目錄,進去裡面進行打修補程式
[root@localhost qq-v1]# patch -p1 <../patch-v2.txt
patching file passwd
patching file sound/3.txt
[root@localhost qq-v1]# cd ..
[root@localhost linuxidc.com]# diff -Nru qq-v1 qq-v2
//沒有輸出結果說明打修補程式成功
[root@localhost linuxidc.com]# cd qq-v1
[root@localhost qq-v1]# patch -R -p1 <../patch-v2.txt //復原修補程式
patching file passwd
patching file sound/3.txt
[root@localhost qq-v1]# cd ..
[root@localhost linuxidc.com]# diff -Nru qq-v1 qq-v2
diff -Nru qq-v1/passwd qq-v2/passwd
--- qq-v1/passwd 1970-01-01 08:00:00.000000000 +0800
+++ qq-v2/passwd 2016-11-02 17:07:47.664980339 +0800
@@ -0,0 +1,31 @@
+root:x:0:0:root:/root:/bin/bash
+bin:x:1:1:bin:/bin:/sbin/nologin
2> 外層打修補程式
//如果qq-v1和qq-v2在相同目錄下,就不需要去掉一層路徑
[root@localhost linuxidc.com]# patch -p0 <patch-v2.txt
patching file qq-v1/passwd
patching file qq-v1/sound/3.txt
牆裂建議:
任何操作前,記得對檔案、目錄做好備份,防止操作失敗導致資料丟失。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-06/144701.htm
相關文章