Linux文件比对diff-第二部分

我们将讨论更多的命令行参数

1、报告文件何时相同

默认情况下,文件相同时,不会产生任何输出

$ diff file1 file2

但是,存在命令参数 (-s)可以强制命令行输出此结果

$ diff -s file1 file2
Files file1 and file2 are identical

2、复制的上下文和统一的上下文

基本上,这两种格式是diff命令可以产生其输出的两种格式。使用-c命令行选项启用了复制的上下文,而使用-u启用了统一上下文。以下是前者的示例

$ diff -c file1 file2
*** file1 2016-12-29 09:36:47.175597647 +0530
--- file2 2016-12-29 09:19:55.799558326 +0530
***************
*** 1,3 ****
Hi
! Helllo
Bye
--- 1,3 ----
Hi
! Hello
Bye

因此,在“复制的上下文”输出格式中,不同的行用感叹号(!)表示。

这是统一上下文格式的示例:

$ diff -u file1 file2
--- file1 2016-12-29 09:36:47.175597647 +0530
+++ file2 2016-12-29 09:19:55.799558326 +0530
@@ -1,3 +1,3 @@
Hi
-Helllo
+Hello
Bye

在此输出格式中,在行之前的+和-符号表示不同行的版本:如果file2中缺少file1中的行,则为“-”;当file2中的行添加到file1中时,为“ +”。

3、输出一个”ed”脚本

diff命令还能够生成命令,“ ed”编辑器可使用该命令将原始文件(此处为示例中的file1)转换为新文件(file2)。这是您的操作方式:

假设file1和file2包含以下更改:

$ diff file1 file2
2c2
< Helllo
---
> Hello

现在,使用-e命令行选项生成“ ed”编辑器可以理解的输出,并将该输出重定向到文件中:

diff -e file1 file2 > out

输出
2c
Hello
.

接下来,您需要在out文件的末尾添加命令“ w”。

2c
Hello
.
w

现在,执行命令

ed - file1 < out

您会看到file1和file2现在相同。

$ diff file1 file2
$

4、在两列中产生输出

存在一个命令行选项(-y),用于引导diff在两个单独的列中产生输出。这是一个例子:

$ diff -y file1 file2
Hi                               Hi
Helllo                         | Hello
Bye                              Bye

如您所见,此输出格式使用’|’表示不同的行。

5、隐藏公共行

如果您观察到上一节(上面的第4点)中显示的输出,您会注意到,使用-y命令行选项,输出中的diff-也会产生公共行。如果需要隐藏这些相同的行,可以使用–suppress-common-lines选项。

diff -y --suppress-common-lines file1 file2
Helllo                                   | Hello

6、显示C函数的每个变化

对于使用diff比较两个C语言文件的情况,有一个命令行选项(-p)指导实用程序精确显示每个更改所在的C函数。例如,假设这是两个C文件:

file1.c:

#include<stdio.h>

void compare(float x, float y)
{
 if(x == y) // incorrect way
 {
 printf("\n EQUAL \n");
 }
}


int main(void)
{
 compare(1.234, 1.56789);

 return 0;
}

file2.c:

#include<stdio.h>

void compare(float x, float y)
{
 if(x == y)
 {
 printf("\n EQUAL \n");
 }
}


int main(void)
{
 compare(1.234, 1.56789);

 return 0;
}

比较输出

$ diff file1.c file2.c 
5c5
< if(x == y) // incorrect way
---
> if(x == y)

使用-p选项比较文件时:

$ diff -p file1.c file2.c 
*** file1.c 2016-12-29 11:45:36.587010816 +0530
--- file2.c 2016-12-29 11:46:39.823013274 +0530
***************
*** 2,8 ****

void compare(float x, float y)
{
! if(x == y) // incorrect way
{
printf("\n EQUAL \n");
}
--- 2,8 ----

void compare(float x, float y)
{
! if(x == y)
{
printf("\n EQUAL \n");
}

如您所见,使用-p时,diff使您更详细地了解更改的位置,并使用感叹号(!)指示不同的行。

7、递归比较子目录

diff命令还允许您递归比较子目录,但这不是默认行为。我的意思是说,如果您采取以下情况:

$ diff diff-files/ second-diff-files/
diff diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello

diff命令仅比较顶级目录中的文件,但是如果使用命令行选项-r(用于递归diff),则会看到甚至比较了子目录中存在的文件:

$ diff -r diff-files/ second-diff-files/
diff -r diff-files/file1 second-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/file2 second-diff-files/file2
2c2
< Hello
---
> ello
diff -r diff-files/more-diff-files/file1 second-diff-files/more-diff-files/file1
1c1
< Hi
---
> i
diff -r diff-files/more-diff-files/file2 second-diff-files/more-diff-files/file2
2c2
< Hello
---
> ello

8、将缺席文件视为空文件

diff命令还提供了一个选项,您可以使用该选项指导该工具将不存在的文件视为空文件。例如,如果将file1与file3(不存在)进行比较,则diff的默认行为是产生错误:

$ diff file1 file3
diff: file3: No such file or directory

这本身是没有错的。实际上,这很合理。但是在某些情况下-您可能不想diff命令在这种情况下抛出错误(虽然是bash脚本的一部分,可能是吗?),那么对于这些​​情况,您可以使用-N命令行选项强制命令将不存在的文件视为空文件,然后继续进行比较。

$ diff -N file1 file3
1,5d0
< Hi
< 
< Helllo
< 
< Bye
踏浪 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!