Linux命令之diff详解程序员

diff [选项] … [文件1或目录1] [文件2或目录2](四种组合方式)
说明:diff命令在最简单的情况下,比较两个文件的不同。如果使用”-”代替文件参数,则要比较的内容将来自标准输入。Diff命令是以逐行的方式比较文本文件的异同之处。如果指定比较的是目录的时候,diff命令会比较两个目录下名字相同的文本文件,但不会比较其中子目录。列出不同的二进制文件、公共子目录和只在一个目录出现的文件
(1).选项
-a,–text 把所有文件当做文本文件逐行比较
-b,–ignore-space-change 忽略空格产生的变化
-B,–ignore-blank-lines 忽略空白行的变化
-c,–C NUM,–context[=NUM] 使用上下文输出格式(文件1在上,文件2在下,在差异点会标注出来),输出NUM(默认3)行的上下文(上下各NUM行,不包括差异行)
-d,–minimal 使用不同的算法,努力寻找一个较小的变化集合。这会使diff变慢(有时更慢)
-D NAME,–ifdef=NAME 合并if-then-else格式输出,预处理宏(由NAME参数提供)条件
-e,–ed 输出一个ed格式的脚本文件
-E,–ignore-all-space 忽略由于Tab扩展而导致的变化
-F RE,–show-function-line=RE 在上下文输出格式(文件1在上,文件2在下)和统一输出格式中,对于每一大块的不同,显示出匹配RE(regexp正则表达式)最近的行
-i,–ignore-case 忽略大小写的区别
-I RE,–ignore-matching-lines=RE 忽略所有匹配RE(regexp正则表达式)的行的更改
-l,–paginate 通过pr编码传递输出,使其分页
-n,–rcs 输出RCS格式差异

-N,–new-file 把缺少的文件当做空白文件处理

-p,–show-c-function 显示带有C函数的变化

-q,–brief 仅输出文件是否有差异,不报告详细差异

-r,–recursive 当比较目录时,递归比较所有找到的子目录

-s,–report-identical-files 当两个文件相同时报告

-S FILE,–starting-file=FILE 在比较目录时,从FILE开始。用于继续中断的比较

-t,–expand-tabs 将输出时扩展Tab转换为空格,保护输入文件的tab对齐方式

-T,–initial-tab 通过预先设置的tab使选项卡对齐(???)

-u,-U NUM,–unified[=NUM] 使用统一输出格式(输出一个整体,只有在差异的地方会输出差异点,并标注出来),输出NUM(默认3)行的上下文(上下各NUM行,不包括差异行)

-v,–version 输出版本号

-w,–ignore-all-space 比较时忽略所有空格

-W NUM,–width=NUM 在并列输出格式时,指定列的宽度为NUM(默认130)

-x PAT,–exclude=PAT 排除与PAT(pattern样式)匹配的文件

-X FILE,–exclude-from=FILE 排除与FILE中样式匹配的文件

-y,–side-by-side 使用并列输出格式

–from-file=FILE1 FILE1与所有操作对象比较,FILE1可以是目录

–help 输出帮助信息

–horizon-lines=NUM 保留NUM行的公共前缀和后缀

–ignore-file-name-case 比较时忽略文件名大小写

–label LABEL 使用LABEL(标识)代替文件名

–left-column (在并列输出格式中)只输出左列的公共行

–no- ignore-file-name-case 比较时考虑文件名大小写

–normal 输出一个正常的差异

–speed-large-files 假设文件十分大,而且有许多微小的差异

–strip-trailing-cr 去掉在输入时尾随的回车符

–suppress-common-lines 不输出公共行

–to-file=FILE2 所有操作对象与FILE2比较,FILE2可以是目录

–unidiredtional-newfile 将缺少的第一个文件视为空文件

 

–GTYPE-group-format=GFMT 以GFMT格式化GTYPE输入组

–line-format=LFMT 以LFMT格式化输入所有行

–LTYPE-line-format=LFMT 以LFMT格式化LTYPE输入行

LTYPE可以是’old’,’new’或’unchanged’。GTYPE可以是LTYPE选项或’changed’

       GFMT包括:

              %< 该行属于FILE1

              %> 该行属于FILE2

              %= 该行属于FILE1和FILE2公共行

              %[-][WIDTH(宽度)][.[PREC(精确度)]]{doxX}LETTER(字母) printf格式规范LETTER。如下字母表示属于新的文件,小写表示属于旧的文件:

                     F 行组中第一行的行号

                     L 行组中最后一行的行号

                     N 行数(=L-F+1)

                     E F-1

                     M L+1

       LFMT可包含:

              %L 该行内容

              %l 该行内容,但不包括尾随的换行符

              %[-][WIDTH][.[PREC]]{doxX}n printf格式规范输入行编号

       GFMT或LFMT可包含:

       %% %

%c’C’ 单个字符C

%c’/000’ 八进制000所代表的字符

(2).实例

在没有任何参数时,diff命令比较

[[email protected] 桌面]# cat>t1.txt<<EOF 
> this is a text! 
>  
> Name is t1.txt! 
> The extra content! 
> I am MenAngel! 
> EOF 
[[email protected] 桌面]# cat> t2.txt    //第二种cat建文件方式,Ctrl+Z退出编辑 
this is a text!       
 
Name is t2.txt! 
^Z 
[1]+  Stopped                 cat > t2.txt 
[[email protected] 桌面]# diff t1.txt t2.txt 
3,5c3    //文件1中的第3行到第5行(3,5)改为(c)文件2中的第3行(3),则两个文件相同。 
< Name is t1.txt!    //<表示FILE1的行 
< The extra content! 
< I am MenAngel! 
--- 
> Name is t2.txt!    //>表示FILE2的行 

 以并列输出格式展示两个文件的不同

[[email protected] 桌面]# diff -y t1.txt t2.txt 
this is a text!							this is a text! 
 
Name is t1.txt!						      |	Name is t2.txt! 
The extra content!					      < 
I am MenAngel!						      < 

 并列输出格式下控制宽度

[[email protected] 桌面]# diff -y -W 40 t1.txt t2.txt 
this is a text!		this is a text! 
 
Name is t1.txt!	   |	Name is t2.txt! 
The extra conten   < 
I am MenAngel!	   < 

 以上下文输出格式展示两个文件的不同

[[email protected] 桌面]# diff -c t1.txt t2.txt  
*** t1.txt	2018-06-23 21:44:15.171207940 +0800    //*代表t1.txt 
--- t2.txt	2018-06-23 21:44:54.987207910 +0800    //-代表t2.txt 
*************** 
*** 1,5 ****    //从第1行到第5行 
  this is a text! 
   
! Name is t1.txt!    //!标注差异行 
! The extra content! 
! I am MenAngel! 
--- 1,3 ----    //从第1行到第3行 
  this is a text! 
   
! Name is t2.txt! 

以统一输出格式展示两个文件的不同

[[email protected] 桌面]# diff -u t1.txt t2.txt  
--- t1.txt	2018-06-23 21:44:15.171207940 +0800    //-代表t1.txt 
+++ t2.txt	2018-06-23 21:44:54.987207910 +0800    //+代表t2.txt 
@@ -1,5 +1,3 @@    //t1.txt第1行到第5行,t2.txt第1行到第3行 
 this is a text! 
  
-Name is t1.txt!    //-代表前面的文件比后面的文件多一行,+代表后面的文件比前面的文件多一行,一般一一对应 
-The extra content! 
-I am MenAngel! 
+Name is t2.txt! 

 文件交换对比位置所带来的差距

[[email protected] 桌面]# diff -y -W 40 t2.txt t1.txt  
this is a text!		this is a text! 
 
Name is t2.txt!	   |	Name is t1.txt! 
		   >	The extra conten 
		   >	I am MenAngel! 
[[email protected] 桌面]# diff -c t2.txt t1.txt  
*** t2.txt	2018-06-23 21:44:54.987207910 +0800 
--- t1.txt	2018-06-23 21:44:15.171207940 +0800 
*************** 
*** 1,3 **** 
  this is a text! 
   
! Name is t2.txt! 
--- 1,5 ---- 
  this is a text! 
   
! Name is t1.txt! 
! The extra content! 
! I am MenAngel! 
[[email protected] 桌面]# diff -u t2.txt t1.txt  
--- t2.txt	2018-06-23 21:44:54.987207910 +0800 
+++ t1.txt	2018-06-23 21:44:15.171207940 +0800 
@@ -1,3 +1,5 @@ 
 this is a text! 
  
-Name is t2.txt! 
+Name is t1.txt! 
+The extra content! 
+I am MenAngel! 

目录与目录间的比较

[[email protected] 桌面]# mkdir dir1 dir2 
[[email protected] 桌面]# cd dir1 
[[email protected] dir1]# cat>text1<<EOF 
> dir:dir1 
> name:text1 
>  
> Total 4! 
> EOF 
[[email protected] dir1]# cat>text2<<EOF 
> I am MenAngel! 
> I am studying the order of Linux! 
> EOF 
[[email protected] dir1]# cd ../dir2 
[[email protected] dir2]# cat>text1<<EOF 
> dir:dir2 
> name:text1 
>  
>  
> Total 5! 
> EOF 
[[email protected] dir2]# cat>text3<<EOF 
> Working hard makes success! 
> I am MenAngel! 
> EOF 
[[email protected] dir2]# cd ../ 
[[email protected] 桌面]# diff dir1 dir2 
diff dir1/text1 dir2/text1    //有相同文件名时自动比较 
1c1 
< dir:dir1 
--- 
> dir:dir2 
4c4,5 
< Total 4! 
--- 
>  
> Total 5! 
Only in dir1: text2    //只有dir1存在text2 
Only in dir2: text3    //只有dir2存在text3 

 生成log文件,diff的输出文件被称为补丁(patch),可以使用patch命令将文件内容更新

[[email protected] 桌面]# diff dir1 dir2>dir.log 
[[email protected] 桌面]# cat dir.log 
diff dir1/text1 dir2/text1 
1c1 
< dir:dir1 
--- 
> dir:dir2 
4c4,5 
< Total 4! 
--- 
>  
> Total 5! 
Only in dir1: text2 
Only in dir2: text3 
[[email protected] 桌面]# diff t1.txt t2.txt >t12.log 
[[email protected] 桌面]# cat t12.log  
3,5c3 
< Name is t1.txt! 
< The extra content! 
< I am MenAngel! 
--- 
> Name is t2.txt!

(3).扩展

vimdiff也可以比较文件

[[email protected] ~]$ vimdiff 1.txt 2.txt  
还有 2 个文件等待编辑 

显示如下情况,退出编辑可以参考vim

Linux命令之diff详解程序员

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/2854.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论