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é)果有四行,分析其表示含義:
-
1c1三個(gè)字段分別表示f1文件第一行發(fā)生修改,修改類型為change,f2文件第一行發(fā)生修改 -
< a表示f1文件第一行的修改內(nèi)容為a -
---作用為分隔符,分割兩個(gè)文件的修改內(nèi)容顯示 -
> 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
***和---分別表示f1和f2文件,修改內(nèi)容展示以***************分割,*** 1,3 ****和--- 1,3 ----分別表示展示的f1和f2文件行數(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
---和+++分別表示f1和f2文件,@@括起來的內(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/f和d2/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)行比較的文件。