以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录
注意: diff描述两个文件不同的方式是告诉我们怎样改变第一个文件之后与第二个文件匹配
选项 | 说明 |
---|---|
-<行数> | 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用 |
-a,–text | diff预设只会逐行比较文本文件 |
-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