diff命令
diff命令是 linux上非常重要的工具,用於比較文件的內容,特別是比較兩個版本不同的文件以找到改動的地方。diff在命令行中打印每一個行的改動。最新版本的diff還支持二進制文件。diff程序的輸出被稱爲補丁 (patch),因爲Linux系統中還有一個patch程序,可以根據diff的輸出將a.c的文件內容更新爲b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。
1.命令格式
diff[參數][文件1或目錄1][文件2或目錄2]
2.命令功能
diff命令能比較單個文件或者目錄內容。如果指定比較的是文件,則只有當輸入爲文本文件時纔有效。以逐行的方式,比較文本文件的異同處。如果指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現的文件。
3.命令參數
-   -指定要顯示多少行的文本。此參數必須與-c或-u參數一併使用。
-   -a或--textdiff預設只會逐行比較文本文件。
-   -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參數時,僅顯示不同之處。
4.使用實例
實例1:比較兩個文件
命令執行和輸出:
[yiibai@localhost ~]$ cat file1.txt
1001
1002
1003
[yiibai@localhost ~]$ cat file2.txt
1001
1002
1003a
1004
[yiibai@localhost ~]$ diff file1.txt file2.txt
3c3,4
< 1003
---
> 1003a
> 1004
[yiibai@localhost ~]$說明:
上面的「3c3,4」表示file1.txt和file2.txt文件在3行和第4行內容有所不同;diff 的 normal 顯示格式有三種提示:
- a - add
- c - change
- d - delete
實例2:並排格式輸出
兩個文件的每一行對比輸出
命令:
diff file1.txt file2.txt  -y -W 50輸出:
[yiibai@localhost ~]$ diff file1.txt file2.txt  -y -W 50
1001                    1001
1002                    1002
1003                  | 1003a
                      > 1004
[yiibai@localhost ~]$說明:
-   「|」表示前後2個文件內容有不同
-   「<」表示後面文件比前面文件少了1行內容
-   「>」表示後面文件比前面文件多了1行內容
實例3:上下文輸出格式
命令:
diff file1.txt file2.txt   -c輸出:
[yiibai@localhost ~]$ diff file1.txt file2.txt   -c
*** file1.txt   2017-02-23 20:34:51.752009952 -0500
--- file2.txt   2017-02-23 20:35:12.590809278 -0500
***************
*** 1,3 ****
  1001
  1002
! 1003
--- 1,4 ----
  1001
  1002
! 1003a
! 1004
[yiibai@localhost ~]$實例4:統一格式輸出
命令:
diff file1.txt file2.txt  -u輸出:
[yiibai@localhost ~]$ diff file1.txt file2.txt  -u
--- file1.txt   2017-02-23 20:34:51.752009952 -0500
+++ file2.txt   2017-02-23 20:35:12.590809278 -0500
@@ -1,3 +1,4 @@
 1001
 1002
-1003
+1003a
+1004
[yiibai@localhost ~]$說明:
它的第一部分,也是文件的基本信息:
--- file1.txt   2017-02-23 20:34:51.752009952 -0500
+++ file2.txt   2017-02-23 20:35:12.590809278 -0500「---"表示變動前的文件,」+++「表示變動後的文件。
第二部分,變動的位置用兩個@作爲起首和結束。@@ -1,3 +1,4 @@
前面的」-1,3「分成三個部分:減號表示第一個文件(即file1.txt),」1「表示第1行,」3」表示連續3行。合在一起,就表示下面是第一個文件從第1行開始的連續3行。同樣的,」+1,4「表示變動後,成爲第二個文件從第1行開始的連續4行。
實例5:比較文件夾不同
命令:
diff  test4 test5輸出:
[yiibai@localhost ~]$ ll test4/
total 4
-rw-rw-r-- 2 yiibai yiibai 559 Feb 23 20:13 newlog.log
[yiibai@localhost ~]$ ll test5/
total 16
-rw-rw-r-- 1 yiibai yiibai  15 Feb 23 20:48 file1.txt
-rw-rw-r-- 1 yiibai yiibai  21 Feb 23 20:48 file2.txt
-rw-rw-r-- 1 yiibai yiibai 559 Feb 23 20:47 newlog.log
-rw-rw-r-- 1 yiibai yiibai  12 Feb 23 20:47 run.py
[yiibai@localhost ~]$ diff  test4 test5
Only in test5: file1.txt
Only in test5: file2.txt
Only in test5: run.py
[yiibai@localhost ~]$實例6:比較兩個文件不同,並生產補丁
命令:
diff -ruN file1.txt file2.txt > patch.txt輸出:
[yiibai@localhost ~]$ diff -ruN file1.txt file2.txt > patch.txt
[yiibai@localhost ~]$ cat patch.txt
--- file1.txt   2017-02-23 20:34:51.752009952 -0500
+++ file2.txt   2017-02-23 20:35:12.590809278 -0500
@@ -1,3 +1,4 @@
 1001
 1002
-1003
+1003a
+1004
[yiibai@localhost ~]$實例7:打補丁
現在,要使用 file1.txt 文件的內容與 file2.txt 文件的內容一樣,命令執行和輸出:
[yiibai@localhost ~]$ cat file1.txt
1001
1002
1003
[yiibai@localhost ~]$ cat file2.txt
1001
1002
1003a
1004
[yiibai@localhost ~]$ diff -ruN file1.txt file2.txt > patch.txt
[yiibai@localhost ~]$ patch file1.txt patch.txt
patching file file1.txt
[yiibai@localhost ~]$ cat file1.txt
1001
1002
1003a
1004
[yiibai@localhost ~]$ cat file2.txt
1001
1002
1003a
1004
[yiibai@localhost ~]$現在可以看到 file1.txt 與 file2.txt 文件的內容一樣了。