Linux命令使用:diff、patch與dirname

Linux 是一種開放源代碼的類 UNIX 操作系統,以其安全性和穩定性的優勢,加上開源的特性和軟件生態,被常用作服務器的操作系統。

下面列舉一些常用的命令使用方式:

1. dirname <path>

功能:更改目錄結構

示例:

tmpuser:~/ $ dirname /a/b/c                                      
/a/b
tmpuser:~/ $ dirname /a/b/c/                                
/a/b

該命令用於返回指定文件的當前目錄,這裏的指定文件也可以是一個目錄。該命令常用於在腳本中切換目錄到指定目錄下,例如切換到執行的腳本當前目錄,示例:

tmpuser:~/ $ cat test/a/b/c.sh                           
cd $(dirname $0)
echo $(pwd)
tmpuser:~/ $ sh test/a/b/c.sh                                    
/home/tmpuser/test/a/b

c.sh 文件內容中的 $0意思是取第一個參數,即調用的腳本自身。關於使用 $ 符號取參數相關操作,$* 獲得給定腳本的輸入參數,不包括腳本自身,$# 獲得給定腳本的輸入參數個數,不包括腳本自身。

$ 符號使用示例:

tmpuser:b/ $ cat c1.sh                                         
echo $*
echo $#
tmpuser:b/ $ sh c1.sh n1 n2                                       
n1 n2
2
2. diff <mode> <file1> <file2>

功能:比較文件修改,生成補丁(patch)文件

示例:

tmpuser:b/ $ cat f1                                               
a
b
c
tmpuser:b/ $ cat f2                                               
d
b
c
tmpuser:b/ $ diff f1 f2                                            
1c1
< a
---
> d

diff 命令用於比較文件的異同,文件的修改無非三種類型:

  • a:addition,增加內容
  • c:change,更改內容
  • d:deletion,刪除內容

上述示例中的比較結果有四行,分析其表示含義:

  1. 1c1 三個字段分別表示 f1 文件第一行發生修改,修改類型爲 changef2 文件第一行發生修改
  2. < a 表示f1文件第一行的修改內容爲 a
  3. --- 作用爲分隔符,分割兩個文件的修改內容顯示
  4. > d 表示f2文件第一行的修改內容爲 d

由分析可知,這種直接的比較結果較爲不直觀,後續增加了兩種比較模式,能夠更清晰的展示文件的差異點。

【1】diff -c <file1> <file2>

context上下文模式展示差異

tmpuser:b/ $ diff -c f1 f2                                         
*** f1  2018-11-19 17:13:40.751373696 +0800
--- f2  2018-11-19 17:13:47.787557172 +0800
***************
*** 1,3 ****
- a
  b
  c
--- 1,3 ----
  b
  c
+ d

***---分別表示f1f2文件,修改內容展示以***************分割,*** 1,3 ****--- 1,3 ----分別表示展示的f1f2文件行數的內容,修改的三種類型:增加、更改、刪除,在上下文模式中的表示方式爲符號表示:

  • +:addition,增加內容
  • !:change,更改內容
  • -:deletion,刪除內容

【2】diff -u <file1> <file2>

unified統一模式展示差異

tmpuser:b/ $ diff -u f1 f2                                        
--- f1  2018-11-19 17:13:40.751373696 +0800
+++ f2  2018-11-19 17:13:47.787557172 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

---+++分別表示f1f2文件,@@括起來的內容中,-1,3表示f1文件第一行有刪除操作,顯示文件一到三行的內容,+1,3表示f2文件第一行有增加操作,顯示文件一到三行的內容,兩個文件的修改都統一顯示在一起。

diff命令的修改結果可以展示在命令窗口中,幫助查看文件的差異,也可以作爲補丁(patch)文件存儲起來,方便後續查看,也可以將生成的補丁文件應用到具體文件中,該行爲多發生於版本控制系統中。

diff -Naru <file1> <file2> > <patch_file>

該命令將比較的修改結果保存到指定文件中。-r表示遞歸處理目錄下文件,-u表示使用統一模式比較,-a表示逐行比較文件內容,-N表示進行目錄比較時,若目錄下有文件不存在,則與空白文件進行比較,而非顯示一句文件是否存在的描述。

示例:

tmpuser:b/ $ diff -Naru f1 f2 > patch_file                        
tmpuser:b/ $ cat patch_file                                       
--- f1  2018-11-19 17:13:40.751373696 +0800
+++ f2  2018-11-19 17:13:47.787557172 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

patch文件內容可知,文件內容與直接輸出在命令窗口內容相同。

3. patch <param> < <patch_file>

功能:應用補丁文件

示例:

tmpuser:b/ $ patch < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                              
b
c
d

該命令將diff命令產生的補丁文件應用到具體文件上,觀察結果可知,f1文件進行了更新。

改命令提供了-R參數,應用取消補丁的應用。

取消應用補丁示例:

tmpuser:b/ $ patch -R < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                               
a
b
c

觀察結果可知,f1文件恢復爲原始內容。

以上所列出的示例,都是相同目錄下直接進行文件比較和補丁應用,當遇到包含目錄的情況時,需要注意目錄等級的調整。

示例:

tmpuser:test/ $ diff -Naru d1 d2 > patch_file                      
tmpuser:test/ $ cat patch_file                                    
diff -Naru d1/a/b/c/f d2/a/b/c/f
--- d1/a/b/c/f  2018-11-19 18:56:30.440988972 +0800
+++ d2/a/b/c/f  2018-11-19 18:57:10.034070898 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

patch_file內容可知,此時比較的是當前目錄下,d1/a/b/c/fd2/a/b/c/f兩個子文件內容。若在當前目錄下使用patch_file文件,則不需要進行目錄等級調整,使用如下命令應用補丁文件:

tmpuser:test/ $ patch -p0 < patch_file                          
patching file d1/a/b/c/f
tmpuser:test/ $ cat d1/a/b/c/f                                   
b
c
d

命令中的-p<num>表示忽略幾級目錄,因爲此時正處於和d1,d2同級目錄下,所以不需要調整目錄等級,參數指定-p0即可。

不妨進入到d1目錄下,再次使用補丁文件,例如使用補丁文件對d1/a/b/c/f文件進行取消補丁應用操作:

tmpuser:test/ $ cd d1                                             
tmpuser:d1/ $ patch -Rp1 < ../patch_file                          
patching file a/b/c/f
tmpuser:d1/ $ cat a/b/c/f                                        
a
b
c

d1/a/b/c/f文件內容可知,該文件已經取消了對補丁文件的應用。

因爲對補丁的應用中,可能存在目錄等級調整的情況,所以在使用diff命令生成補丁文件時,儘量不使用絕對目錄指定進行比較的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章