0%

远看高低各不同 diff

远看高低各不同 diff

.. note::
草色烟光残照里,无言谁会凭阑意
宋代 柳永《蝶恋花·伫倚危楼风细细》

Linux diff 命令用于比较文件的差异。

当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机即用的。

官方定义为:

GNU diff - compare files line by line

diff 会以逐行的方式,比较文本文件的不同。

如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。

语法

1
$ diff [OPTION]... FILES

参数

  • -c 显示所有内容,并标出不同之处。
  • -u 以合并的方式来显示文件内容的不同。
  • -y--side-by-side  两列输出显示文件的异同之处。

假定有两个文件ab,内容分别为:

1
2
3
4
5
6
7
8
9
$ cat a
This is a.
Hello a.
Hello World.

$ cat b
This is b.
Hello b.
Hello World.

默认比较两个文件

默认情况下,直接输入下面命令即可:

1
2
3
4
5
6
7
8
9
$  diff a b
1,2c1,2
< This is a.
< Hello a.
---
> This is b.
> Hello b.
3a4
> One more line.

可以看到1,2c1,2,中间有一个字母c3a4,中间有一个字母a

那么ac什么含义呢,中间的字母表示需要在第一个文件上做的操作(a=add,c=change,d=delete),然后才有后面的文件一致。

所以1,2c1,2表示1,2行更换后一致;3a4表示,增加一行后一致。

并排显示方便比较

这种方式相对而言,就很亲民了,左右两边两列方便比对。

1
2
3
4
5
$ diff a b -y
This is a. | This is b.
Hello a. | Hello b.
Hello World. Hello World.
> One more line.

那么:

  • “|”表示前后2个文件内容有不同;

  • “<”表示后面文件比前面文件少了1行内容

  • “>”表示后面文件比前面文件多了1行内容

context模式比较

这种模式会输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下*** 表示a的内容,--- 表示b的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ diff a b -c
*** a 2013-03-04 23:20:20.322345200 +0800
--- b 2013-03-04 23:26:30.712130000 +0800
***************
*** 1,3 ****
! This is a.
! Hello a.
Hello World.
--- 1,4 ----
! This is b.
! Hello b.
Hello World.
+ One more line.

unified模式比较

这种模式会混合输出所有的文件内容,并显示不同之处,还包括具体的时间。

如下--- 表示a的内容,+++ 表示b的内容。

1
2
3
4
5
6
7
8
9
10
$  diff a b -u
--- a 2013-03-04 23:20:20.322345200 +0800
--- b 2013-03-04 23:26:30.712130000 +0800
@@ -1,3 +1,4 @@
-This is a.
-Hello a.
+This is b.
+Hello b.
Hello World.
+One more line.

对比时忽略空格

1
2
3
4
5
# diff -w name_list.txt name_list_new.txt

2c2,3
< John Doe --- > John M Doe
> Jason Bourne

快速找出两个目录的不同

diff命令会按行比较文件。但是它也可以比较两个目录:

1
2
3
4
ls -l /tmp/r
ls -l /tmp/s
# 使用 diff 比较两个文件夹
diff /tmp/r/ /tmp/s/
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道