Linux命令之 diff 详解

发布时间:2024年01月17日

以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录

注意: diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配

选项说明
-<行数>指定要显示多少行的文本。此参数必须与-c或-u参数一并使用
-a,–textdiff预设只会逐行比较文本文件
-b,--ignore-space-change不检查空格
-B,--ignore-blank-lines不检查空白行
-c上下文格式显示
-C<行数>,–context<行数>与执行"-c-<行数>"指令相同
-d,–minimal使用不同的演算法,以较小的单位来做比较
-D<巨集名称>,ifdef<巨集名称>此参数的输出格式可用于前置处理器巨集
-e,–ed此参数的输出格式可用于ed的script文件
-f,-forward-ed输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处
-H,–speed-large-files比较大文件时,可加快速度
-I<字符或字符串>,–ignore-matching-lines<字符或字符串>若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异
-i,--ignore-case不检查大小写
-l,–paginate将结果交由pr程序来分页
-n,–rcs将比较结果以RCS的格式来显示
-N,–new-file在比较目录时,若文件A仅出现在某个目录中,预设会显示
Only in目录文件A若使用-N参数,则diff会将文件A与一个空白的文件比较
-p若比较的文件为C语言的程序码文件时,显示差异所在的函数名称
-P,–unidirectional-new-file与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较
-q,–brief仅显示有无差异,不显示详细的信息
-r,–recursive比较子目录中的文件
-s,–report-identical-files若没有发现任何差异,仍然显示信息
-S<文件>,–starting-file<文件>在比较目录时,从指定的文件开始比较
-t,–expand-tabs在输出时,将tab字符展开
-T,–initial-tab在每行前面加上tab字符以便对齐
-u,-U<列数>,--unified=<列数>合并格式显示
-w,--ignore-all-space忽略所有空格
-W<宽度>,–width<宽度>在使用-y参数时,指定栏宽
-x<文件名或目录>,–exclude<文件名或目录>不比较选项中所指定的文件或目录
-X<文件>,–exclude-from<文件>您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件
-y或–side-by-side以并列的方式显示文件的异同之处
–left-column在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容
–suppress-common-lines在使用-y参数时,仅显示不同之处

样例文件

第一个文件file1.txt
	aaaa
	111
	hello world
	222
	333
	bbb
第二个文件file2.txt
	aaa
	hello
	111
	222
	bbb
	333
	world

示例文件

# 1.直接比较显示
diff file1.txt file2.txt 
1c1,2	第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配
< aaaa	小于号"<"表示左边的文件(file1.txt)内容
---	---表示分隔符
> aaa	大于号">"表示右边的文件(file2.txt)内容
> hello
3d3	第一个文件的第3行删除(d=delete)后才能和第二个文件的的第3行匹配
< hello world
5d4	第一个文件的第5行删除后才能和第二个文件的第4行匹配
< 333
6a6,7	第一个文件的第6行增加(a=add)内容后才能和第二个文件的第6到7行匹配
> 333	需要增加的内容在第二个文件里是333和world
> world

# 2.上下文管理显示
diff -c file1.txt file2.txt 
前两行主要列出需要比较的文件名和文件的时间戳; 文件名前面的符号***表示file1,---表示file2
*** file1.txt   2022-10-10 15:02:13.411246629 +0800
--- file2.txt   2022-10-10 15:03:36.562357165 +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.合并格式显示
diff -u file1.txt file2.txt 
前两行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号---表示file1,+++表示file2
--- file1.txt   2022-10-10 15:27:25.034079408 +0800
+++ file2.txt   2022-10-10 15:03:36.562357165 +0800
@@ -1,6 +1,7 @@
-aaaa
+aaa
+hello
 111
-hello world
 222
-333
 bbb
+333
+world

# 4.默认情况下也会比较两个目录里相同文件的内容
# 如果只需要比较两个目录里文件的不同,不需要进一步比较文件内容, 需要加-q选项
diff ../09 ../10
只在 ../10 存在:1_1.txt
只在 ../10 存在:1.txt
只在 ../10 存在:2.txt
只在 ../10 存在:3.txt
只在 ../10 存在:file1.txt
只在 ../10 存在:file2.txt
只在 ../09 存在:file_list.txt
diff ../09/passwd ../10/passwd
1c1
< ROOT:x:0:0:ROOT:/ROOT:/bin/bash
---
> root:x:0:0:root:/root:/bin/bash
只在 ../10 存在:vsftpd.conf

其他小技巧: 有时候我们需要以一个文件为标准, 去修改其他文件, 并且修改的地方较多时, 我们可以通过打补丁的方式完成

# 先安装 patch
yum install patch
# 1)先找出文件不同,然后输出到一个文件
diff -uN file1.txt file2.txt > file.patch
-u	上下文模式
-N	将不存在的文件当做空文件
# 2)将不同内容打补丁到文件
patch file1 file.patch
# 3)测试验证
diff file1 file2
文章来源:https://blog.csdn.net/m0_49620121/article/details/135440927
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。