分类: LINUX
2009-11-23 20:24:12
参考资料:
http://blog.csdn.net/zhanglei6645/archive/2007/10/16/1827728.aspx
diff [选项] file1 file2
【功能】
该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。
【举例】
设有这样两个文件:
程序清单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 hello.c hello_diff.c
输入之后,输出如下:
1a2
> #include
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
> #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;
} }
这里,并排格式的对比一目了然,可以快速找到不同的地方。-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
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;
}
这里,在开头两行作了比较文件的说明,这里有三中特殊字符:
+ 比较的文件的后者比前着多一行
- 比较的文件的后者比前着少一行
! 比较的文件两者有差别的行
*查看这两个文件的不同之处,统一输出格式:
$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;
}
这里,统一格式的输出更加紧凑,所以更易于理解,更易于修改。
*查看两个文件是否不同又不想显示差异之处:
$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的使用:
1) 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则会提示警告告诉你用反了。
2) 内核补丁
*生成
$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