diff命令


diff命令是 linux上非常重要的工具,用於比較檔案的內容,特別是比較兩個版本不同的檔案以找到改動的地方。diff在命令列中列印每一個行的改動。最新版本的diff還支援二進位制檔案。diff程式的輸出被稱為修補程式 (patch),因為Linux系統中還有一個patch程式,可以根據diff的輸出將a.c的檔案內容更新為b.cdiff是svn、cvs、git等版本控制工具不可或缺的一部分。

1.命令格式

diff[引數][檔案1或目錄1][檔案2或目錄2]

2.命令功能

diff命令能比較單個檔案或者目錄內容。如果指定比較的是檔案,則只有當輸入為文字檔案時才有效。以逐行的方式,比較文字檔案的異同處。如果指定比較的是目錄的的時候,diff 命令會比較兩個目錄下名字相同的文字檔案。列出不同的二進位制檔案、公共子目錄和只在一個目錄出現的檔案。

3.命令引數

  • -  指定要顯示多少行的文字。此引數必須與-c或-u引數一併使用。
  • -a--text diff預設只會逐行比較文字檔案。
  • -b--ignore-space-change  不檢查空格字元的不同。
  • -B--ignore-blank-lines  不檢查空白行。
  • -c  顯示全部內文,並標出不同之處。
  • -C--context  與執行」-c-「指令相同。
  • -d--minimal  使用不同的演演算法,以較小的單位來做比較。
  • -Difdef  此引數的輸出格式可用於前置處理器巨集。
  • -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.txtfile2.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.txtfile2.txt 檔案的內容一樣了。