diff命令是 linux上非常重要的工具,用于比較文件的內(nèi)容,特別是比較兩個版本不同的文件以找到改動的地方。diff
在命令行中打印每一個行的改動。最新版本的diff
還支持二進制文件。diff
程序的輸出被稱為補丁 (patch),因為Linux系統(tǒng)中還有一個patch程序,可以根據(jù)diff
的輸出將a.c
的文件內(nèi)容更新為b.c
。diff
是svn、cvs、git等版本控制工具不可或缺的一部分。
diff[參數(shù)][文件1或目錄1][文件2或目錄2]
diff
命令能比較單個文件或者目錄內(nèi)容。如果指定比較的是文件,則只有當輸入為文本文件時才有效。以逐行的方式,比較文本文件的異同處。如果指定比較的是目錄的的時候,diff
命令會比較兩個目錄下名字相同的文本文件。列出不同的二進制文件、公共子目錄和只在一個目錄出現(xiàn)的文件。
-
指定要顯示多少行的文本。此參數(shù)必須與-c或-u參數(shù)一并使用。-a
或--text
diff預設(shè)只會逐行比較文本文件。-b
或--ignore-space-change
不檢查空格字符的不同。-B
或--ignore-blank-lines
不檢查空白行。-c
顯示全部內(nèi)文,并標出不同之處。-C
或--context
與執(zhí)行”-c-“指令相同。-d
或--minimal
使用不同的演算法,以較小的單位來做比較。-D
或ifdef
此參數(shù)的輸出格式可用于前置處理器巨集。-e
或--ed
此參數(shù)的輸出格式可用于ed的script文件。-f
或-forward-ed
輸出的格式類似ed的script文件,但按照原來文件的順序來顯示不同處。-H
或--speed-large-files
比較大文件時,可加快速度。-l
或--ignore-matching-lines
若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異。-i
或--ignore-case
不檢查大小寫的不同。-l
或--paginate
將結(jié)果交由pr程序來分頁。-n
或--rcs
將比較結(jié)果以RCS的格式來顯示。-N
或--new-file
在比較目錄時,若文件A僅出現(xiàn)在某個目錄中,預設(shè)會顯示:Only in目錄:文件A若使用-N參數(shù),則diff會將文件A與一個空白的文件比較。-p
若比較的文件為C語言的程序碼文件時,顯示差異所在的函數(shù)名稱。-P
或--unidirectional-new-file
與-N類似,但只有當?shù)诙€目錄包含了一個第一個目錄所沒有的文件時,才會將這個文件與空白的文件做比較。-q
或--brief
僅顯示有無差異,不顯示詳細的信息。-r
或--recursive
比較子目錄中的文件。-s
或--report-identical-files
若沒有發(fā)現(xiàn)任何差異,仍然顯示信息。-S
或--starting-file
在比較目錄時,從指定的文件開始比較。-t
或--expand-tabs
在輸出時,將tab字符展開。-T
或--initial-tab
在每行前面加上tab字符以便對齊。-u
,-U
或--unified=
以合并的方式來顯示文件內(nèi)容的不同。-v
或--version
顯示版本信息。-w
或--ignore-all-space
忽略全部的空格字符。-W
或--width
在使用-y參數(shù)時,指定欄寬。-x
或--exclude
不比較選項中所指定的文件或目錄。-X
或--exclude-from
您可以將文件或目錄類型存成文本文件,然后在=中指定此文本文件。-y
或--side-by-side
以并列的方式顯示文件的異同之處。--help
顯示幫助。--left-column
在使用-y參數(shù)時,若兩個文件某一行內(nèi)容相同,則僅在左側(cè)的欄位顯示該行內(nèi)容。--suppress-common-lines
在使用-y
參數(shù)時,僅顯示不同之處。命令執(zhí)行和輸出:
[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行內(nèi)容有所不同;diff
的 normal 顯示格式有三種提示:
兩個文件的每一行對比輸出
命令:
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
個文件內(nèi)容有不同<
”表示后面文件比前面文件少了1
行內(nèi)容>
”表示后面文件比前面文件多了1
行內(nèi)容命令:
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 ~]$
命令:
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
“---"
表示變動前的文件,”+++
“表示變動后的文件。
第二部分,變動的位置用兩個@作為起首和結(jié)束。@@ -1,3 +1,4 @@
前面的”-1,3
“分成三個部分:減號表示第一個文件(即file1.txt),”1
“表示第1
行,”3”表示連續(xù)3
行。合在一起,就表示下面是第一個文件從第1
行開始的連續(xù)3
行。同樣的,”+1,4
“表示變動后,成為第二個文件從第1
行開始的連續(xù)4
行。
命令:
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 ~]$
命令:
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 ~]$
現(xiàn)在,要使用 file1.txt
文件的內(nèi)容與 file2.txt
文件的內(nèi)容一樣,命令執(zhí)行和輸出:
[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 ~]$
現(xiàn)在可以看到 file1.txt
與 file2.txt
文件的內(nèi)容一樣了。