首頁 > 軟體

Linux下打修補程式patch 和 diff 命令的使用

2020-06-16 17:13:12

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


IT145.com E-mail:sddin#qq.com