diff [選項] file1 file2
功能
該命令的功能為逐行比較兩個文本文件,列出其不同之處。它比 comm
命令完成更復雜的檢查。它對給出的文件進行系統的檢查,并顯示出兩個文件中所有不同的行,不要求事先對文件進行排序。
舉例
假設有這樣兩個文件:
-
程序清單1 :hello.c
#include <stdio.h> int main(void) { char msg[] = "Hello world!"; puts(msg); printf("Welcome to use diff commond.\n"); return 0; }
-
程序清單2:hello_diff.c
#include <stdio.h> #include <stdlib.h> 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 hello.c hello_diff.c 1a2 > #include <stdlib.h> 5c6 < char msg[] = "Hello world!"; --- > char msg[] = "Hello world,fome hello_diff.c"; 8c9 < printf("Welcome to use diff commond.\n"); --- > printf("hello_diff.c says,'Here you are,using diff.'\n");
這里,
1a2
表示后面的一個文件hello_diff.c
比前面的一個文件hello.c
多了一行5c6
表示第一個文件的第5行與第二個文件的第6行有區別。 -
查看這兩個文件的不同之處,并排輸出格式:
$diff hello.c hello_diff.c -y -W 130 #include <stdio.h> #include <stdio.h> > #include <stdlib.h> 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.'\n"); return 0; return 0; } }
這里,并排格式的對比一目了然,可以快速找到不同的地方。
-W
選擇可以指定輸出列的寬度,這里指定輸出列寬為130。 -
查看這兩個文件的不同之處,上下文格式輸出:
$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 <stdio.h> int main(void) { ! char msg[] = "Hello world!"; puts(msg); ! printf("Welcome to use diff commond.\n"); return 0; } --- 1,12 ---- #include <stdio.h> + #include <stdlib.h> 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 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 <stdio.h> +#include <stdlib.h> 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; }
這里,統一格式的輸出更加緊湊,所以更易于理解,更易于修改。
-
查看兩個文件是否不同又不想顯示差異之處
$diff hello.c hello_diff.c -q Files hello.c and hello_diff.c differ
這里,如果兩個文件相同,那么不會輸出任何信息。
-
查看這兩個文件的不同之處,忽略帶有“ include”字樣的行:
$diff hello.c hello_diff.c -c -I include *** 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; }
這里,另外你還可以提供一些匹配規則來忽略某中差別,可以用
-I regexp(正則表達式)
.
描述
說明:該命令告訴用戶,為了使兩個文件 file1
和 file2
一致,需要修改它們的哪些行。如果用 -
表示 file1
或 fiie2
,則表示標準輸入。如果 file1
或 file2
是目錄,那么 diff
將使用該目錄中的同名文件進行比較。
參數
-b 忽略行尾的空格,而字符串中的一個或多個空格符都視為相等。
-c 采用上下文輸出格式(提供三行上下文)。
-C n 采用上下文輸出格式(提供n行上下文)。
-e 產生一個合法的ed腳本作為輸出。
-r 當file1和file2是目錄時,遞歸作用到各文件和目錄上。-
結果
例如:diff /usr/xu mine
把目錄/usr/xu
中名為mine
的文件與當前目錄中的mine
文件進行比較。通常輸出由下述形式的行組成:
n1 a n3,n4 n1,n2 d n3 n1,n2 c n3,n4
這些行類似
ed
命令把filel
轉換成file2
。字母(a
、d
和c
)之前的行號(n1
,n2
)是針對file1
的,其后面的行號(n3
,n4
)是針對file2
的。字母a
、d
和=c= 分別表示附加、刪除和修改操作。在上述形式的每一行的后面跟隨受到影響的若干行,以
<
打頭的行屬于第一個文件,以>
打頭的行屬于第二個文件。另外,=diff= 能區別塊和字符設備文件以及FIFO(管道文件),不會把它們與普通文件進行比較。
其它
diff
和 patch
的使用:
diff/patch
這對工具在數學上來說, diff
是對2個集合求差, patch
是求和
-
生成
A
和B
的diff文件C
:$diff A B > C
這里
C
相當于A
到B
的一個“補丁”文件,記錄兩者之間的差異。 -
給
A
打上diff文件得到B
:$patch A C
這里,如果用
patch B C
則會提示警告告訴你用反了。 -
B
還原為A
:$patch -R B C
這里,如果用
patch -R A C
則會提示警告告訴你用反了。
內核補丁
-
生成
$diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch
-
升級
$cp diff.patch linux-2.6.xxx/. $cd linux-2.6.xxx $patch -p1 < diff.patch
參考資料
http://baike.baidu.com/view/1374858.htm
http://blog.csdn.net/zhanglei6645/archive/2007/10/16/1827728.aspx