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,刪除內容
上述示例中的比較結果有四行,分析其表示含義:
-
1c1
三個字段分別表示f1
文件第一行發生修改,修改類型爲change
,f2
文件第一行發生修改 -
< a
表示f1
文件第一行的修改內容爲a
-
---
作用爲分隔符,分割兩個文件的修改內容顯示 -
> 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
***
和---
分別表示f1
和f2
文件,修改內容展示以***************
分割,*** 1,3 ****
和--- 1,3 ----
分別表示展示的f1
和f2
文件行數的內容,修改的三種類型:增加、更改、刪除,在上下文模式中的表示方式爲符號表示:
- +: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
---
和+++
分別表示f1
和f2
文件,@@
括起來的內容中,-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/f
和d2/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
命令生成補丁文件時,儘量不使用絕對目錄指定進行比較的文件。