Linux 命令使用:diff、patch與dirname

Linux 是一種開放源代碼的類 UNIX 操作系統(tǒng),以其安全性和穩(wěn)定性的優(yōu)勢,加上開源的特性和軟件生態(tài),被常用作服務(wù)器的操作系統(tǒng)。

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

1. dirname <path>

功能:更改目錄結(jié)構(gòu)

示例:

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

該命令用于返回指定文件的當(dāng)前目錄,這里的指定文件也可以是一個(gè)目錄。該命令常用于在腳本中切換目錄到指定目錄下,例如切換到執(zhí)行的腳本當(dāng)前目錄,示例:

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 文件內(nèi)容中的 $0意思是取第一個(gè)參數(shù),即調(diào)用的腳本自身。關(guān)于使用 $ 符號取參數(shù)相關(guān)操作,$* 獲得給定腳本的輸入?yún)?shù),不包括腳本自身,$# 獲得給定腳本的輸入?yún)?shù)個(gè)數(shù),不包括腳本自身。

$ 符號使用示例:

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

功能:比較文件修改,生成補(bǔ)丁(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,增加內(nèi)容
  • c:change,更改內(nèi)容
  • d:deletion,刪除內(nèi)容

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

  1. 1c1 三個(gè)字段分別表示 f1 文件第一行發(fā)生修改,修改類型為 change,f2 文件第一行發(fā)生修改
  2. < a 表示f1文件第一行的修改內(nèi)容為 a
  3. --- 作用為分隔符,分割兩個(gè)文件的修改內(nèi)容顯示
  4. > d 表示f2文件第一行的修改內(nèi)容為 d

由分析可知,這種直接的比較結(jié)果較為不直觀,后續(xù)增加了兩種比較模式,能夠更清晰的展示文件的差異點(diǎn)。

【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文件,修改內(nèi)容展示以***************分割,*** 1,3 ****--- 1,3 ----分別表示展示的f1f2文件行數(shù)的內(nèi)容,修改的三種類型:增加、更改、刪除,在上下文模式中的表示方式為符號表示:

  • +:addition,增加內(nèi)容
  • !:change,更改內(nèi)容
  • -:deletion,刪除內(nèi)容

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

unified統(tǒng)一模式展示差異

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文件,@@括起來的內(nèi)容中,-1,3表示f1文件第一行有刪除操作,顯示文件一到三行的內(nèi)容,+1,3表示f2文件第一行有增加操作,顯示文件一到三行的內(nèi)容,兩個(gè)文件的修改都統(tǒng)一顯示在一起。

diff命令的修改結(jié)果可以展示在命令窗口中,幫助查看文件的差異,也可以作為補(bǔ)丁(patch)文件存儲起來,方便后續(xù)查看,也可以將生成的補(bǔ)丁文件應(yīng)用到具體文件中,該行為多發(fā)生于版本控制系統(tǒng)中。

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

該命令將比較的修改結(jié)果保存到指定文件中。-r表示遞歸處理目錄下文件,-u表示使用統(tǒng)一模式比較,-a表示逐行比較文件內(nèi)容,-N表示進(jìn)行目錄比較時(shí),若目錄下有文件不存在,則與空白文件進(jì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文件內(nèi)容可知,文件內(nèi)容與直接輸出在命令窗口內(nèi)容相同。

3. patch <param> < <patch_file>

功能:應(yīng)用補(bǔ)丁文件

示例:

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

該命令將diff命令產(chǎn)生的補(bǔ)丁文件應(yīng)用到具體文件上,觀察結(jié)果可知,f1文件進(jìn)行了更新。

改命令提供了-R參數(shù),應(yīng)用取消補(bǔ)丁的應(yīng)用。

取消應(yīng)用補(bǔ)丁示例:

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

觀察結(jié)果可知,f1文件恢復(fù)為原始內(nèi)容。

以上所列出的示例,都是相同目錄下直接進(jìn)行文件比較和補(bǔ)丁應(yīng)用,當(dāng)遇到包含目錄的情況時(shí),需要注意目錄等級的調(diào)整。

示例:

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內(nèi)容可知,此時(shí)比較的是當(dāng)前目錄下,d1/a/b/c/fd2/a/b/c/f兩個(gè)子文件內(nèi)容。若在當(dāng)前目錄下使用patch_file文件,則不需要進(jìn)行目錄等級調(diào)整,使用如下命令應(yīng)用補(bǔ)丁文件:

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>表示忽略幾級目錄,因?yàn)榇藭r(shí)正處于和d1,d2同級目錄下,所以不需要調(diào)整目錄等級,參數(shù)指定-p0即可。

不妨進(jìn)入到d1目錄下,再次使用補(bǔ)丁文件,例如使用補(bǔ)丁文件對d1/a/b/c/f文件進(jìn)行取消補(bǔ)丁應(yīng)用操作:

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文件內(nèi)容可知,該文件已經(jīng)取消了對補(bǔ)丁文件的應(yīng)用。

因?yàn)閷ρa(bǔ)丁的應(yīng)用中,可能存在目錄等級調(diào)整的情況,所以在使用diff命令生成補(bǔ)丁文件時(shí),盡量不使用絕對目錄指定進(jìn)行比較的文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容