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命令比较

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

[root@CentOS6 桌面]# cat>t1.txt<<EOF

this is a text!

>

> Name is t1.txt!

> The extra content!

> I am MenAngel!

> EOF

[root@CentOS6 桌面]# cat> t2.txt    //第二种cat建文件方式,Ctrl+Z退出编辑

this is a text!     

 

Name is t2.txt!

^Z

[1]+  Stopped                 cat > t2.txt

[root@CentOS6 桌面]# 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的行

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

1

2

3

4

5

6

[root@CentOS6 桌面]# 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!                            <

 并列输出格式下控制宽度

1

2

3

4

5

6

[root@CentOS6 桌面]# 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!     <

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

[root@CentOS6 桌面]# 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!

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

1

2

3

4

5

6

7

8

9

10

[root@CentOS6 桌面]# 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!

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

[root@CentOS6 桌面]# 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!

[root@CentOS6 桌面]# 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!

[root@CentOS6 桌面]# 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!

目录与目录间的比较

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

[root@CentOS6 桌面]# mkdir dir1 dir2

[root@CentOS6 桌面]# cd dir1

[root@CentOS6 dir1]# cat>text1<<EOF

> dir:dir1

> name:text1

>

> Total 4!

> EOF

[root@CentOS6 dir1]# cat>text2<<EOF

> I am MenAngel!

> I am studying the order of Linux!

> EOF

[root@CentOS6 dir1]# cd ../dir2

[root@CentOS6 dir2]# cat>text1<<EOF

> dir:dir2

> name:text1

>

>

> Total 5!

> EOF

[root@CentOS6 dir2]# cat>text3<<EOF

> Working hard makes success!

> I am MenAngel!

> EOF

[root@CentOS6 dir2]# cd ../

[root@CentOS6 桌面]# 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命令将文件内容更新

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

[root@CentOS6 桌面]# diff dir1 dir2>dir.log

[root@CentOS6 桌面]# 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

[root@CentOS6 桌面]# diff t1.txt t2.txt >t12.log

[root@CentOS6 桌面]# cat t12.log

3,5c3

< Name is t1.txt!

< The extra content!

< I am MenAngel!

---

> Name is t2.txt!

(3).扩展

vimdiff也可以比较文件

1

2

[xf@xuexi ~]$ vimdiff 1.txt 2.txt

还有 2 个文件等待编辑

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

 

 

转载:https://www.cnblogs.com/diantong/p/9238348.html

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值