绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Linux命令学习手册-diff
2020-03-24 13:58:52



`diff [选项] file1 file2`

# 功能

该命令的功能为逐行比较两个文本文件,列出其不同之处。它比 `comm` 命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

# 举例

假设有这样两个文件:

1. 程序清单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. 程序清单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>

<http://www.linuxdiyf.com/viewarticle.php?id=42597>

分享好友

点击获得分享链接,复制给好友成功购买后您可以获得2成返利哦~

Linux系统之路
创建时间:2019-12-27 16:09:53
分享Linux系统操作与相关知识
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • QuietHeart
    栈主

小栈成员

查看更多
  • ?
  • 栈栈
  • 飘絮絮絮丶
戳我,来吐槽~