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