diff 比較兩個文件的差異


功能:比較兩個文件的差異,並把不同地方的信息顯示出來。默認diff格式的信息。

diff比較兩個文件或文件集合的差異,並記錄下來,生成一個diff文件,這也是我們常說的補丁文件。也使用patch命令對相應的文件打補丁。differential [ˌdɪfəˈrenʃəl]

語法:diff    [options]   FILES

FILES的格式:

  • FILE1 FILE2 :源是一個文件,目標也是文件。這兩個文件必須是文本文件。以逐行的方式,比較文本文件的異同處。
  • DIR1 DIR2   :源是一個目錄,目標是目錄。diff 命令會比較兩個目錄下名字相同的文本文件,依照字母次序排序,列出不同的二進制文件,列出公共子目錄,列出只在一個目錄出現的文件。
  • FILE DIR     :源是一個文件,目標是目錄。diff命令把源文件與目標目錄下的同名文件比較。
  • DIR FILE     :源是一個目錄,目標是文件(不是目錄)。源目錄下所有文件中與目標文件同名的文件,將用來與目標文件比較。

FILE可以是“-”,代表由標准輸入設備讀入的文本。DIR不能是"-"。
被指定的文件不能是標准的輸入。

 

短選項 長選項 含義
-i --ignore-case 忽略文件內容大小寫的區別
  --ignore-file-name-case 忽略文件名大小寫的區別
  --no-ignore-file-name-case 不忽略文件名大小寫的區別
-E --ignore-tab-expansion 忽略由制表符寬度造成的差異
-b --ignore-space-change 忽略由空格數不同造成的差異
-w --ignore-all-space 忽略所有空格
-B --ignore-blank-lines 忽略任何因空行而造成的差異
-I --ignore-matching-lines=RE 如果某行匹配正則表達式,則忽略由該行造成的差異
-a --text 所有文件都以文本方式處理
  --strip-trailing-cr 去除輸入內容每行末端的 carriage return 字符
-c 或 或 -C 行數 --context[=行數] 顯示指定<行數>(默認 3 行)copied 格式的上下文
-u  或 -U 行數 --unified[=行數] 顯示指定<行數>(默認 3 行)unified 格式的上下文(合並的方式)
  --label 標識 使用<標識>代替文件名稱
-p --show-c-function 顯示和每個差異有關的 C 函數名稱
-F  --show-function-line=RE 顯示最接近而符合<正則表示式>的一行
-q --brief 只顯示文件是否不同
-e --ed 以 ed script 方式輸出
  --normal 以正常的 diff 方式輸出
-n --rcs 以 RCS diff 格式輸出
-y --side-by-side 以兩列並排的方式顯示
-W --width=NUM 每行顯示最多 NUM (默認 130) 個字符
  --left-column 當有兩行相同時只顯示左邊的一行
  --suppress-common-lines 當有兩行相同時不會顯示
-D --ifdef=NAME 輸出的內容以‘#ifdef NAME’方式標明差異
  --GTYPE-group-format=GFMT 效果類似,但會以 GFMT 格式處理 GTYPE 輸入的行
可以是LTYPE的選擇或是‘changed’
  --line-format=LFMT 效果類似,但會以 LFMT 格式處理每一行資料
  --LTYPE-line-format=LFMT 效果類似,但會以 LFMT 格式處理 LTYPE 輸入的行
LTYPE 可以是‘old’、‘new’或‘unchanged’。
-l --paginate 將輸出送至‘pr’指令來分頁
-t --expand-tabs 將輸出中的 tab 轉換成空格
-T --initial-tab 每行先加上 tab 字符,使 tab 字符可以對齊
  --tabsize=NUM 定位字符 (tab) 的寬度,默認為 8 個空格寬
  --suppress-blank-empty suppress space or tab before empty output lines
-r --recursive 遞歸比較子目錄中的文件
-N --new-file 不存在的文件以空文件方式處理
  --unidirectional-new-file 若第一文件案不存在,以空文件處理
-s --report-identical-files 文件相同則報告,否則無任何提示
-x --exclude=PAT 排除匹配 PAT 的文件
-X --exclude-from=FILE 排除所有匹配在 FILE 中列出的模式的文件
-S --starting-file=FILE 當比較目錄時,由 FILE 開始比較
  --from-file=FILE1 將 FILE1 和操作數中的所有文件/目錄作比較。FILE1 可以是目錄
  --to-file=FILE2 將操作數中的所有文件/目錄和 FILE2 作比較。FILE2 可以是目錄
  --horizon-lines=NUM keep NUM lines of the common prefix and suffix
-d --minimal 盡可能找出最小的差異
  --speed-large-files 假設文件十分大而且其中含有許多微小的差異

diff輸出格式(默認):
n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
n1,n2 d n3 表示在n1到n2行之間刪除n3行
n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替換掉
字母a:表示附加(add)
字符c:表示修改(change)
字符d:表示刪除(delete)
字母前的是源文件,字母后是目標文件。Nx表示行號。 
以”<”打頭的行屬於第一個文件,以”>”打頭的行屬於第二個文件。

比較文件

log2014.log內容 2013-01 2013-02 2014-03 2013-04 2013-05 2013-06 2013-07 2013-07 2013-09 2013-10 2013-11 2013-12

log2013.log內容 2013-01 2013-02 2013-03 2013-04 2013-05 2013-06 2013-07 2013-08 2013-09 2013-10

比較兩個文件 
[root@localhost test3]# diff log2014.log log2013.log    
3c3 
< 2014-03 
--- 
> 2013-03 
8c8 
< 2013-07 
--- 
> 2013-08 
11,12d10 
< 2013-11 
< 2013-12
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行內容有所不同;"11,12d10"表示第一個文件比第二個文件多了第11和12行。
以”<”打頭的行屬於第一個文件,以”>”打頭的行屬於第二個文件。
並排格式輸出 [root@localhost test3]# diff log2014.log log2013.log -y -W 50 2013-01 2013-01 2013-02 2013-02 2014-03 | 2013-03 2013-04 2013-04 2013-05 2013-05 2013-06 2013-06 2013-07 2013-07 2013-07 | 2013-08 2013-09 2013-09 2013-10 2013-10 2013-11 < 2013-12 < [root@localhost test3]# diff log2013.log log2014.log -y -W 50 2013-01 2013-01 2013-02 2013-02 2013-03 | 2014-03 2013-04 2013-04 2013-05 2013-05 2013-06 2013-06 2013-07 2013-07 2013-08 | 2013-07 2013-09 2013-09 2013-10 2013-10 > 2013-11 > 2013-12 說明:
“|”表示前后2個文件內容有不同
“<”表示后面文件比前面文件少了1行內容
“>”表示后面文件比前面文件多了1行內容

上下文輸出格式 [root@localhost test3]# diff log2013.log log2014.log -c *** log2013.log 2012-12-07 16:36:26.000000000 +0800 --- log2014.log 2012-12-07 18:01:54.000000000 +0800 *************** *** 1,10 **** 2013-01 2013-02 ! 2013-03 2013-04 2013-05 2013-06 2013-07 ! 2013-08 2013-09 2013-10 --- 1,12 ---- 2013-01 2013-02 ! 2014-03 2013-04 2013-05 2013-06 2013-07 ! 2013-07 2013-09 2013-10 + 2013-11 + 2013-12 [root@localhost test3]# diff log2014.log log2013.log -c *** log2014.log 2012-12-07 18:01:54.000000000 +0800 --- log2013.log 2012-12-07 16:36:26.000000000 +0800 *************** *** 1,12 **** 2013-01 2013-02 ! 2014-03 2013-04 2013-05 2013-06 2013-07 ! 2013-07 2013-09 2013-10 - 2013-11 - 2013-12 --- 1,10 ---- 2013-01 2013-02 ! 2013-03 2013-04 2013-05 2013-06 2013-07 ! 2013-08 2013-09 2013-10 [root@localhost test3]# 這種方式在開頭兩行作了比較文件的說明,這里有三中特殊字符:
“+” 比較的文件的后者比前着多一行
“-” 比較的文件的后者比前着少一行
“!” 比較的文件兩者有差別的行
統一格式輸出 [root@localhost test3]# diff log2014.log log2013.log -u --- log2014.log 2012-12-07 18:01:54.000000000 +0800 +++ log2013.log 2012-12-07 16:36:26.000000000 +0800 @@ -1,12 +1,10 @@ 2013-01 2013-02 -2014-03 +2013-03 2013-04 2013-05 2013-06 2013-07 -2013-07 +2013-08 2013-09 2013-10 -2013-11 -2013-12 第一部分,也是文件的基本信息:
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
"---"表示變動前的文件,"+++"表示變動后的文件。

第二部分,變動的位置用兩個@作為起首和結束
@@ -1,12 +1,10 @@
前面的"-1,12"分成三個部分:減號表示第一個文件(即log2014.log),"1"表示第1行,"12"表示連續12行。意思:第一個文件從第1行開始的連續12行。
同樣的,"+1,10" 表示第二個文件從第1行開始的連續10行。

 

比較文件夾

[root@localhost test]# diff test3 test6 
Only in test6: linklog.log 
Only in test6: log2012.log 
 
[root@localhost test]# diff test3/log2013.log test6/log2013.log 
1,10c1,3 
< 2013-01 
< 2013-02 
< 2013-03 
< 2013-04 
< 2013-05 
< 2013-06 
< 2013-07 
< 2013-08 
< 2013-09 
< 2013-10 
--- 
> hostnamebaidu=baidu.com 
> hostnamesina=sina.com 
> hostnames=true 
 
[root@localhost test]# diff test3/log2014.log test6/log2014.log 
1,12d0 
< 2013-01 
< 2013-02 
< 2014-03 
< 2013-04 
< 2013-05 
< 2013-06 
< 2013-07 
< 2013-07 
< 2013-09 
< 2013-10 
< 2013-11 
< 2013-12 
Only in test6: log2015.log 
Only in test6: log2016.log 
Only in test6: log2017.log 
[root@localhost test]# 

 

比較兩個文件不同,並生產補丁

[root@localhost test3]# diff -ruN log2013.log log2014.log >patch.log 
[root@localhost test3]# ll 
總計 12 
-rw-r--r-- 2 root root  80 12-07 16:36 log2013.log 
-rw-r--r-- 1 root root  96 12-07 18:01 log2014.log 
-rw-r--r-- 1 root root 248 12-07 21:33 patch.log 
 
[root@localhost test3]# cat patch.log 
--- log2013.log 2012-12-07 16:36:26.000000000 +0800 
+++ log2014.log 2012-12-07 18:01:54.000000000 +0800 
@@ -1,10 +1,12 @@ 
 2013-01 
 2013-02 
-2013-03 
+2014-03 
 2013-04 
 2013-05 
 2013-06 
 2013-07 
-2013-08 
+2013-07 
 2013-09 
 2013-10 
+2013-11 
+2013-12 
[root@localhost test3]#

 

打補丁

[root@localhost test3]# cat log2013.log 
2013-01 
2013-02 
2013-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-08 
2013-09 
2013-10 
 
[root@localhost test3]# patch log2013.log patch.log  使用上面產生的patch.log文件打補丁 
patching file log2013.log 
 
[root@localhost test3]# cat log2013.log 
2013-01 
2013-02 
2014-03 
2013-04 
2013-05 
2013-06 
2013-07 
2013-07 
2013-09 
2013-10 
2013-11 
2013-12 
[root@localhost test3]# 

 

實例

實例:有這樣兩個文件。程序清單1,程序清單2 
程序清單1 :hello.c 
#include 
int main(void) 
{ 
    char msg[] = "Hello world!"; 
    
    puts(msg); 
    printf("Welcome to use diff commond.n"); 
    
    return 0;  
} 
 
程序清單2:hello_diff.c 
#include 
#include  
int main(void) 
{ 
    char msg[] = "Hello world,fome hello_diff.c"; 
    
    puts(msg); 
    printf("hello_diff.c says,'Here you are,using diff.'n"); 
    
    return 0; 
}

我們使用diff命令來查看這兩個文件的不同之處,有一下幾種方便的方法:


1、普通格式輸出: [root@localhost diff]# diff hello.c hello_diff.c 1a2 > #include 5c6 char msg[] = "Hello world,fome hello_diff.c"; 8c9 printf("hello_diff.c says,'Here you are,using diff.'n"); [root@localhost diff]# 上面的“1a2”表示后面的一個文件"hello_diff.c"比前面的一個文件"hello.c"多了一行
"5c6"表示第一個文件的第5行與第二個文件的第6行有區別
2、並排格式輸出 [root@localhost diff]# diff hello.c hello_diff.c -y -W 130 -W選擇可以指定輸出列的寬度,這里指定輸出列寬為130 #include #include > #include int main(void) int main(void) { { char msg[] = "Hello world!"; | char msg[] = "Hello world,fome hello_diff.c"; puts(msg); puts(msg); printf("Welcome to use diff commond.n"); | printf("hello_diff.c says,'Here you are,using diff.' return 0; return 0; } } [root@localhost diff]# 這種並排格式的對比一目了然,可以快速找到不同的地方。 3、上下文輸出格式 [root@localhost diff]# diff hello.c hello_diff.c -c *** hello.c 2007-09-25 17:54:51.000000000 +0800 --- hello_diff.c 2007-09-25 17:56:00.000000000 +0800 *************** *** 1,11 **** #include int main(void) { ! char msg[] = "Hello world!"; puts(msg); ! printf("Welcome to use diff commond.n"); return 0; } --- 1,12 ---- #include + #include int main(void) { ! char msg[] = "Hello world,fome hello_diff.c"; puts(msg); ! printf("hello_diff.c says,'Here you are,using diff.'n"); return 0; } [root@localhost diff]# 這種方式在開頭兩行作了比較文件的說明,這里有三中特殊字符:
+ 比較的文件的后者比前着多一行
- 比較的文件的后者比前着少一行
! 比較的文件兩者有差別的行
4、統一輸出格式 [root@localhost diff]# diff hello.c hello_diff.c -u --- hello.c 2007-09-25 17:54:51.000000000 +0800 +++ hello_diff.c 2007-09-25 17:56:00.000000000 +0800 @@ -1,11 +1,12 @@ #include +#include int main(void) { - char msg[] = "Hello world!"; + char msg[] = "Hello world,fome hello_diff.c"; puts(msg); - printf("Welcome to use diff commond.n"); + printf("hello_diff.c says,'Here you are,using diff.'n"); return 0; } [root@localhost diff]# 5、其他 [root@localhost diff]# diff hello.c hello_diff.c -q 假如你想查看兩個文件是否不同又不想顯示差異之處的話,可以加上-q選項 Files hello.c and hello_diff.c differ [root@localhost diff]# [root@localhost diff]# diff hello.c hello_diff.c -c -I include 這里通過“ -I include”選項來忽略帶有“ include”字樣的行。另外你還可以提供一些匹配規則來忽略某中差別,可以用 -I regexp *** hello.c 2007-09-25 17:54:51.000000000 +0800 --- hello_diff.c 2007-09-25 17:56:00.000000000 +0800 *************** *** 2,11 **** int main(void) { ! char msg[] = "Hello world!"; puts(msg); ! printf("Welcome to use diff commond.n"); return 0; } --- 3,12 ---- int main(void) { ! char msg[] = "Hello world,fome hello_diff.c"; puts(msg); ! printf("hello_diff.c says,'Here you are,using diff.'n"); return 0; } [root@localhost diff]#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM