我们将讨论更多的命令行参数
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