diff工具用于逐行比较文件的不同
注意:diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配。
语法和选项
语法:
diff [选项] 文件1 文件2
常用选项:
选项 | 含义 | 备注 |
---|---|---|
-b | 不检查空格 | |
-B | 不检查空白行 | |
-i | 不检查大小写 | |
-w | 忽略所有的空格 | |
--normal | 正常格式显示(默认) | |
-c | 上下文格式显示 | |
-u | 合并格式显示 |
举例说明:
-
比较两个普通文件异同,文件准备:
[root@MissHou ~]# cat file1 aaaa 111 hello world 222 333 bbb [root@MissHou ~]# cat file2 aaa hello 111 222 bbb 333 world
1)正常显示
diff目的:file1如何改变才能和file2匹配 [root@MissHou ~]# diff file1 file2 1c1,2 第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配 < aaaa 小于号"<"表示左边文件(file1)文件内容 --- ---表示分隔符 > aaa 大于号">"表示右边文件(file2)文件内容 > hello 3d3 第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配 < hello world 5d4 第一个文件的第5行删除后才能和第二个文件的第4行匹配 < 333 6a6,7 第一个文件的第6行增加(a=add)内容后才能和第二个文件的第6到7行匹配 > 333 需要增加的内容在第二个文件里是333和world > world
2)上下文格式显示
-
[root@MissHou ~]# diff -c file1 file2 前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号***表示file1,---表示file2 *** file1 2019-04-16 16:26:05.748650262 +0800 --- file2 2019-04-16 16:26:30.470646030 +0800 *************** 我是分隔符 *** 1,6 **** 以***开头表示file1文件,1,6表示1到6行 ! aaaa !表示该行需要修改才与第二个文件匹配 111 - hello world -表示需要删除该行才与第二个文件匹配 222 - 333 -表示需要删除该行才与第二个文件匹配 bbb --- 1,7 ---- 以---开头表示file2文件,1,7表示1到7行 ! aaa 表示第一个文件需要修改才与第二个文件匹配 ! hello 表示第一个文件需要修改才与第二个文件匹配 111 222 bbb + 333 表示第一个文件需要加上该行才与第二个文件匹配 + world 表示第一个文件需要加上该行才与第二个文件匹配
3)合并格式显示
-
[root@MissHou ~]# diff -u file1 file2 前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号---表示file1,+++表示file2 --- file1 2019-04-16 16:26:05.748650262 +0800 +++ file2 2019-04-16 16:26:30.470646030 +0800 @@ -1,6 +1,7 @@ -aaaa +aaa +hello 111 -hello world 222 -333 bbb +333 +world
比较两个目录不同
-
默认情况下也会比较两个目录里相同文件的内容 [root@MissHou tmp]# diff dir1 dir2 diff dir1/file1 dir2/file1 0a1 > hello Only in dir1: file3 Only in dir2: test1 如果只需要比较两个目录里文件的不同,不需要进一步比较文件内容,需要加-q选项 [root@MissHou tmp]# diff -q dir1 dir2 Files dir1/file1 and dir2/file1 differ Only in dir1: file3 Only in dir2: test1
其他小技巧:
有时候我们需要以一个文件为标准,去修改其他文件,并且修改的地方较多时,我们可以通过打补丁的方式完成。
1)先找出文件不同,然后输出到一个文件 [root@MissHou ~]# diff -uN file1 file2 > file.patch -u:上下文模式 -N:将不存在的文件当作空文件 2)将不同内容打补丁到文件 [root@MissHou ~]# patch file1 file.patch patching file file1 3)测试验证 [root@MissHou ~]# diff file1 file2