Linux基础命令之: Linux常用命令
2.1.4文件比较合并相关命令
1.diff
(1)作用。
比较两个不同的文件或不同目录下的两个同名文件功能,并生成补丁文件。
(2)格式。
diff[选项]文件1文件2
diff比较文件1和文件2的不同之处,并按照选项所指定的格式加以输出。diff的格式分为命令格式和上下文格式,其中上下文格式又包括了旧版上下文格式和新版上下文格式,命令格式分为标准命令格式、简单命令格式及混合命令格式,它们之间的区别会在使用实例中进行详细讲解。当选项缺省时,diff默认使用混合命令格式。
(3)主要参数。
diff主要选项参数如表2.26所示。
表2.26 diff命令常见参数列表
选项 | 参数含义 |
-r | 对目录进行递归处理 |
-q | 只报告文件是否有不同,不输出结果 |
-e,-ed | 命令格式 |
-f | RCS(修订控制系统)命令简单格式 |
-c,--context | 旧版上下文格式 |
-u,--unified | 新版上下文格式 |
-Z | 调用compress来压缩归档文件,与-x联用时调用compress完成解压缩 |
(4)使用实例。
以下有两个文件hello1.c和hello2.c。
/*hello1.c*/
#includestdio.h>
voidmain()
{
printf(Hello!Thisismyhome!n);
}
/*hello2.c*/
#includestdio.h>
voidmain()
{
printf(Hello!Thisisyourhome!n);
}
以下实例主要讲解了各种不同格式的比较和补丁文件的创建方法。
①主要格式比较。
首先使用旧版上下文格式进行比较。
[root@localhostdavid]#diff-chello1.chello2.c
***hello1.cSatJan1416:24:512006
---hello2.cSatJan1416:54:412006
***************
***1,5****
#includestdio.h>
voidmain()
{
!printf(Hello!Thisismyhome!n);
}
---1,5----
#includestdio.h>
voidmain()
{
!printf(Hello!Thisisyourhome!n);
}
可以看出,用旧版上下文格式进行输出时,在显示每个有差别行的同时还显示该行的上下3行,区别的地方用“!”加以标出,由于示例程序较短,上下3行已经包含了全部代码。
接着使用新版的上下文格式进行比较。
[root@localhostdavid]#diff-uhello1.chello2.c
---hello1.cSatJan1416:24:512006
+++hello2.cSatJan1416:54:412006
@@-1,5+1,5@@
#includestdio.h>
voidmain()
{
-printf(Hello!Thisismyhome!n);
+printf(Hello!Thisisyourhome!n);
}
可以看出,在新版上下文格式输出时,仅把两个文件的不同之处分别列出,而相同之处没有重复列出,这样大大方便了用户的阅读。
接下来使用命令格式进行比较。
[root@localhostdavid]#diff-ehello1.chello2.c
4c
printf(Hello!Thisisyourhome!n);
可以看出,命令符格式输出时仅输出了不同的行,其中命令符“4c”中的数字表示行编号,字母的含义为:a表示添加,b表示删除,c表示更改。因此,-e选项的命令符表示:若要把hello1.c变为hello2.c,就需要把hello1.c的第4行改为显示出的“printf(“Hello!Thisisyourhome!n”);”。
选项“-f”和选项“-e”显示的内容基本相同,就是数字和字母的顺序相交换了,从以下的输出结果可以看出。
[root@localhostdavid]#diff-fhello1.chello2.c
c4
printf(Hello!Thisisyourhome!n);
在diff选项缺省的情况下,输出结果如下所示。
[root@localhostdavid]#diffhello1.chello2.c
4c4
printf(Hello!Thisismyhome!n);
---
>printf(Hello!Thisisyourhome!n);
可以看出,diff缺省情况下的输出格式充分显示了如何将hello1.c转化为hello2.c,即通过“4c4”实现。
②创建补丁文件(也就是差异文件)是diff的功能之一,不同的选项格式可以生成与之相对应的补丁文件,如下面扔例子所示。
[root@localhostdavid]#diffhello1.chello2.c>hello.patch
[root@localhostdavid]#vihello.patch
4c4
printf(Hello!Thisismyhome!n);
---
>printf(Hello!Thisisyourhome!n);
可以看出,使用缺省选项创建补丁文件的内容和前面使用缺省选项的输出内容是一样的。
小知识 | 上例中所使用的”>“是输出重定向。通常在Linux上执行一个shell命令行时,会自动打开3个标准文件:标准输入文件(stdin),即通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),前两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,并且将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。这就是通常使用的标准输入/输出方式。 直接使用标准输入/输出文件存在以下问题:首先,用户输入的数据只能使用一次。当下次希望再次使用这些数据时就不得不重新输入。同样,用户对输出信息不能做更多的处理,只能等待程序的结束。 为了解决上述问题,Linux系统为输入、输出的信息传送引入了两种方式:输入/输出重定向机制和管道(在1.3.1的小知识中已有介绍)。其中,输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。同样,输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就可以不显示在屏幕上,而是写入到指定文件中。就如上述例子中所用到的把“diffhello1.chello2.c”的结果重定向到hello.patch文件中。这就大大增加了输入/输出的灵活性。 |
评论