diff 命令是 linux上很是重要的工具,用於比較文件的內容,特別是比較兩個版本不一樣的文件以找到改動的地方。diff在命令行中打印每個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱爲補丁 (patch),由於Linux系統中還有一個patch程序,能夠根據diff的輸出將a.c的文件內容更新爲b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。git
diff [參數] [文件1或目錄1] [文件2或目錄2]
diff命令能比較單個文件或者目錄內容。若是指定比較的是文件,則只有當輸入爲文本文件時纔有效。以逐行的方式,比較文本文件的異同處。
若是指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不一樣的二進制文件、公共子目錄和只在一個目錄出現的文件。
參數 | 描述 |
---|---|
-行數 | 指定要顯示多少行的文本。此參數必須與-c或-u參數一併使用。 |
-a | 或--text ,diff預設只會逐行比較文本文件。 |
-b | 或--ignore-space-change ,不檢查空格字符的不一樣。 |
-B | 或--ignore-blank-lines ,不檢查空白行。 |
-c | 顯示所有內文,並標出不一樣之處。 |
-C行數 | 或--context行數 與執行"-c-行數"指令相同。 |
-d | 或--minimal , 使用不一樣的演算法,以較小的單位來作比較。 |
-D | 或ifdef , 此參數的輸出格式可用於前置處理器巨集。 |
-e | 或--ed , 此參數的輸出格式可用於ed的script文件。 |
-f | 或-forward-ed ,輸出的格式相似ed的script文件,但按照原來文件的順序來顯示不一樣處。 |
-H | 或--speed-large-files , 比較大文件時,可加快速度。 |
-l | 或--ignore-matching-lines ,若兩個文件在某幾行有所不一樣,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差別。 |
-i | 或--ignore-case ,不檢查大小寫的不一樣。 |
-l | 或--paginate ,將結果交由pr程序來分頁。 |
-n | 或--rcs ,將比較結果以RCS的格式來顯示。 |
-N | 或--new-file ,在比較目錄時,若文件A僅出如今某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。 |
-p | 若比較的文件爲C語言的程序碼文件時,顯示差別所在的函數名稱。 |
-P | 或--unidirectional-new-file ,與-N相似,但只有當第二個目錄包含了一個第一個目錄所沒有的文件時,纔會將這個文件與空白的文件作比較。 |
-q | 或--brief , 僅顯示有無差別,不顯示詳細的信息。 |
-r | 或--recursive ,比較子目錄中的文件。 |
-s | 或--report-identical-files, 若沒有發現任何差別,仍然顯示信息。 |
-S | 或--starting-file , 在比較目錄時,從指定的文件開始比較。 |
-t | 或--expand-tabs ,在輸出時,將tab字符展開。 |
-T | 或--initial-tab ,在每行前面加上tab字符以便對齊。 |
-u | ,-U或--unified= , 以合併的方式來顯示文件內容的不一樣。 |
-v | 或--version , 顯示版本信息。 |
-w | 或--ignore-all-space , 忽略所有的空格字符。 |
-W | 或--width , 在使用-y參數時,指定欄寬。 |
-x | 或--exclude , 不比較選項中所指定的文件或目錄。 |
-X | 或--exclude-from , 您能夠將文件或目錄類型存成文本文件,而後在=中指定此文本文件。 |
-y | 或--side-by-side ,以並列的方式顯示文件的異同之處。 |
--help | 顯示幫助。 |
--left-column | 在使用-y參數時,若兩個文件某一行內容相同,則僅在左側的欄位顯示該行內容。 |
--suppress-common-lines 在使用-y參數時,僅顯示不一樣之處。 |
命令:算法
diff 2.log 1.log
輸出:ide
[root@localhost test]# cat 1.log 第一行 第二行 我是log1第3行 第四行 第五行 第六行 [root@localhost test]# cat 2.log 第一行 第二行 我是log2第3行 第四行 [root@localhost test]# diff 2.log 1.log 3c3 < 我是log2第3行 --- > 我是log1第3行 4a5,6 > 第五行 > 第六行
說明:svn
上面的"3c3"表示1.log和2.log文件在3行內容有所不一樣;"4a5,6"表示第2個文件比第1個文件多了第5和6行。函數
diff 的normal 顯示格式有三種提示:工具
a - addspa
c - change命令行
d - delete版本控制
命令:
diff 2.log 1.log -y -W 50
輸出:
[root@localhost test]# diff 2.log 1.log -y -W 50 第一行 第一行 第二行 第二行 我是log2第3行 | 我是log1第3行 第四行 第四行 > 第五行 > 第六行
[root@localhost test]# diff 1.log 2.log -y -W 50 第一行 第一行 第二行 第二行 我是log1第3行 | 我是log2第3行 第四行 第四行 第五行 < 第六行 <
說明:
「|」表示先後2個文件內容有不一樣
「<」表示後面文件比前面文件少了1行內容
「>」表示後面文件比前面文件多了1行內容
命令:
diff 2.log 1.log -c
輸出:
[root@localhost test]# diff 2.log 1.log -c *** 2.log 2018-12-03 10:21:24.914596171 +0800 --- 1.log 2018-12-03 10:22:30.922589959 +0800 *************** *** 1,4 **** 第一行 第二行 ! 我是log2第3行 第四行 --- 1,6 ---- 第一行 第二行 ! 我是log1第3行 第四行 + 第五行 + 第六行 [root@localhost test]# diff 1.log 2.log -c *** 1.log 2018-12-03 10:22:30.922589959 +0800 --- 2.log 2018-12-03 10:21:24.914596171 +0800 *************** *** 1,6 **** 第一行 第二行 ! 我是log1第3行 第四行 - 第五行 - 第六行 --- 1,4 ---- 第一行 第二行 ! 我是log2第3行 第四行
說明:
這種方式在開頭兩行做了比較文件的說明,這裏有三中特殊字符:
「+」 比較的文件的後者比前着多一行
「-」 比較的文件的後者比前着少一行
「!」 比較的文件二者有差異的行
命令:
diff 2.log 1.log -c
輸出:
[root@localhost test]# diff 2.log 1.log -u --- 2.log 2018-12-03 10:21:24.914596171 +0800 +++ 1.log 2018-12-03 10:22:30.922589959 +0800 @@ -1,4 +1,6 @@ 第一行 第二行 -我是log2第3行 +我是log1第3行 第四行 +第五行 +第六行
說明:
它的第一部分,也是文件的基本信息:
--- 2.log 2018-12-03 10:21:24.914596171 +0800
+++ 1.log 2018-12-03 10:22:30.922589959 +0800
"---"表示變更前的文件,"+++"表示變更後的文件。
第二部分,變更的位置用兩個@做爲起首和結束。
@@ -1,4 +1,6 @@
前面的"-1,4"分紅三個部分:減號表示第一個文件(即2.log),"1"表示第1行,"4"表示連續4行。合在一塊兒,就表示下面是第一個文件從第1行開始的連續4行。一樣的,"+1,6"表示變更後,成爲第二個文件從第1行開始的連續6行。
命令:
diff test test2
輸出:
[root@localhost hc]# ls test 1.log 2.log 2.log.back [root@localhost hc]# ls test2 1.log 2.log [root@localhost hc]# diff test test2 diff test/1.log test2/1.log 5,6d4 < 第五行 < 第六行 diff test/2.log test2/2.log 4c4,5 < 第四行 --- > 第四行1 > 第五行 Only in test: 2.log.back
命令:
diff -ruN 2.log.back 2.log > patch.log
輸出:
[root@localhost test]# cat 2.log 第一行 第二行 我是log2第3行 第四行 [root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 [root@localhost test]# diff -ruN 2.log.back 2.log > patch.log [root@localhost test]# ll total 16 -rw-r--r-- 1 root root 68 12月 3 10:22 1.log -rw-r--r-- 1 root root 48 12月 3 10:21 2.log -rw-r--r-- 1 root root 38 12月 3 11:06 2.log.back -rw-r--r-- 1 root root 165 12月 3 11:06 patch.log [root@localhost test]# cat patch.log --- 2.log.back 2018-12-03 11:06:25.587342012 +0800 +++ 2.log 2018-12-03 10:21:24.914596171 +0800 @@ -1,3 +1,4 @@ 第一行 第二行 我是log2第3行 +第四行
命令:
patch 2.log.back patch.log
輸出:
[root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 [root@localhost test]# patch 2.log.back patch.log patching file 2.log.back [root@localhost test]# cat 2.log.back 第一行 第二行 我是log2第3行 第四行