1.命令作用
逐行比较文件内容(Compare FILES line by line)
2.命令语法
Usage: diff [OPTION]... FILES
3.参数详解
OPTION:
- --normal,输出一个标准的不同信息(默认参数,可以忽略该参数)
- -q, --brief,仅当文件不同时汇报(文件相同不输出任何内容,不同时仅提示文件不同)
- -s, --report-identical-files,当两个文件相同时报告(文件相同时仅提示文件相同,不同时参考--normal的标准输出)
- -c, -C NUM, --context[=NUM],以复制上下文的方式输出(即两文件分开输出,标记不同处)
- -u, -U NUM, --unified[=NUM],以统一上下文的方式输出(即两文件一起输出,标记不同处)
- -e, --ed,输出一个ed脚本(脚本描述如果将file1怎么修改为file2)
- -n, --rcs,输出一个RCS格式差异
- -y, --side-by-side,两列/并列格式输出差异
- -W, --width=NUM,两列/并列格式输出时,指定显示的宽度(默认为130字节)
- --left-column,两列/并列格式输出时,只输出相同行的左文件列
- --suppress-common-lines,两列/并列格式输出时,不输出相同行
- -p, --show-c-function,显示每个更改的C函数,与-c差不多
- -F, --show-function-line=RE,显示与正则表达式RE匹配的最新一行
- --label LABEL,使用LABEL代替文件名
- -t, --expand-tabs,在输出中将制表符展开为空格
- -T, --initial-tab,通过添加制表符使制表符对齐
- --tabsize=NUM,两列/并列格式输出时,tab制表符每NUM打印列
- --suppress-blank-empty,在空输出行前禁止空格或制表符
- -l, --paginate,通过'pr'传递输出以对其进行分页
- -r, --recursive,递归地比较找到的所有子目录
- --no-dereference,不要使用符号链接
- -N, --new-file,将不存在的文件视为空文件
- --unidirectional-new-file,将不存在的第一个文件视为空文件
- --ignore-file-name-case,比较文件名时忽略大小写
- --no-ignore-file-name-case,比较文件名时要考虑大小写
- -x, --exclude=PAT,目录对比时,排除与PAT匹配的文件
- -X, --exclude-from=FILE,排除与FILE内容中文件名匹配的文件
- -S, --starting-file=FILE,比较目录时从FILE开始,仅显示FILE不同对比之后的内容
- --from-file=FILE1,比较FILE1和所有操作数,FILE1可以是一个目录
- --to-file=FILE2,比较所有操作数与FILE2,FILE2可以是一个目录
- -i, --ignore-case,忽略文件内容中的大小写差异
- -E, --ignore-tab-expansion,忽略由于TAB扩展而引起的更改
- -Z, --ignore-trailing-space,忽略行尾的空白
- -b, --ignore-space-change,忽略空白量的变化
- -w, --ignore-all-space,忽略所有空白
- -B, --ignore-blank-lines,忽略行全为空的更改
- -I, --ignore-matching-lines=RE,忽略所有行匹配正则的更改
- -a, --text,将所有文件视为文本(如把二进制也视为文本文件)
- --strip-trailing-cr,忽略行尾的回车符差异(如Windows与Linux文件的对比)
- -D, --ifdef=NAME,输出与'#ifdef NAME'不同的合并文件
- --GTYPE-group-format=GFMT,格式GTYPE输入组与GFMT
- --line-format=LFMT,用LFMT格式化所有输入行
- --LTYPE-line-format=LFMT,用LFMT格式化LTYPE输入行
- -d, --minimal,使用不同的算法以较小的单位进行比较(和默认显示格式差不多)
- --horizon-lines=NUM,保留通用前缀和后缀的NUM行
- --speed-large-files,用于提升大文件对比的效率
注:以上参数没有加粗即标色的未测试出显著效果,望广大网友评论区赐教。
4.常用用例
4.1.四种输出格式
对比文件内容
[root@node2 Desktop]# cat test1.txt
aaa aaa
bbbbbb
cccccc
dddddd
111111
222222
333333
444444
[root@node2 Desktop]# cat test2.txt
aaa aaa
cccccc
bbbbbb
dddddd
111111
333333
444444
222222
eeeeee
4.1.1.正常格式(--normal)
正常默认格式对比输出
[root@node2 Desktop]# diff test1.txt test2.txt
1,2c1
< aaa aaa
< bbbbbb
---
> aaa aaa
3a3
> bbbbbb
6d5
< 222222
8a8,9
> 222222
> eeeeee
[root@node2 Desktop]#
输出说明:
- 输出结果实质是,用以说明test1.txt变成test2.txt需要做哪些改变。
- 1,2c1,c前面的1,2代表test1.txt的第1行到第2行,c后面的1代表文件test2.txt的第1行,c(change)代表变化;输出前5行意思是test1.txt变成test2.txt,需要将test1.txt文件的第1行到第二行改成test2.txt的第一行
- 3a3,a前后的3分布代表test1.txt和test2.txt的第3行,a(add)代表添加;输出第6-7行意思是test1.txt变成test2.txt,需要test1.txt文件的第三行后添加bbbbbb
- 6d5,d前后的6和5分布代表test1.txt的第6行和test2.txt的第5行,d(delete)代表删除;输出的8-9行意思是test1.txt变成test2.txt,需要删除test1.txt的第6行
- 8a8,9,输出的最后3行意思是test1.txt变成test2.txt,需要test1.txt文件第8行后添加222222和eeeeee两行,然后与test2.txt的第8-9行一样
输出总结说明:
- 字母a代表添加(add)、c代表变化(change)、d代表删除(delete)
- 字符前后数字代表对比的两个文件的内容行数,如1,3代表1至3行,包括第二行
- < 代表左边文件内容
- > 代表右边文件内容
- --- 用于分割两个文件不同内容的分割线
4.1.2.上下文格式(-c, -C NUM)
上下文格式对比输出
[root@node2 Desktop]# diff -c test1.txt test2.txt
*** test1.txt 2025-02-20 17:22:32.986170929 +0800
--- test2.txt 2025-02-20 17:00:37.925138321 +0800
***************
*** 1,8 ****
! aaa aaa
! bbbbbb
cccccc
dddddd
111111
- 222222
333333
444444
--- 1,9 ----
! aaa aaa
cccccc
+ bbbbbb
dddddd
111111
333333
444444
+ 222222
+ eeeeee
输出总结说明:
- ***部分显示左边文件,---部分显示右边文件内容
- 文件后的时间是文件最后修改时间
- 1,8 代表1至8行,1,9 代表1至9行
- ! 类似 c ,改变
- + 类似 a,添加
- - 类似 d,删除
4.1.3.合并格式(-u, -U NUM)
合并格式对比输出
[root@node2 Desktop]# diff -u test1.txt test2.txt
--- test1.txt 2025-02-20 17:22:32.986170929 +0800
+++ test2.txt 2025-02-20 17:00:37.925138321 +0800
@@ -1,8 +1,9 @@
-aaa aaa
-bbbbbb
+aaa aaa
cccccc
+bbbbbb
dddddd
111111
-222222
333333
444444
+222222
+eeeeee
输出总结说明:
- ---部分显示左边文件,+++部分显示右边文件内容
- 文件后的时间是文件最后修改时间
- @@ -1,8 +1,9 @@代表两个文件的行,-1,8代表左边文件的1至8行,+1,9代表右边文件的1至9行
- - 代表删除
- + 代表添加
4.1.4.并列格式(-y, --side-by-side)
并列格式对比输出
[root@node2 Desktop]# diff -y test1.txt test2.txt
aaa aaa | aaa aaa
bbbbbb <
cccccc cccccc
> bbbbbb
dddddd dddddd
111111 111111
222222 <
333333 333333
444444 444444
> 222222
> eeeeee
[root@node2 Desktop]#
输出总结说明:
- | 代表前后/左右两个文件内容有不同
- < 代表左边文件比右边文件多内容
- > 代表左边文件比右边文件少内容
4.2.其他常用对比输出
4.2.1.目录对比(-r, --recursive)
[root@node2 ~]# diff -r Desktop/ dir1
Only in Desktop/: aaa
Only in Desktop/: AAA
Only in Desktop/: aaaa
Only in Desktop/: bbb
Only in Desktop/: hostname
Only in Desktop/: test
diff -r Desktop/test1.txt dir1/test1.txt
2c2
< bbbbbb
---
>
[root@node2 ~]#
输出说明:
- 前6行代表仅左边目录存在文件,右边目录不存在的文件
- 后5行代表左右两个目录test1.txt文件内容不同
4.2.2.忽略空格对比(-Z、-b、-w)
## 文件test3.txt第一行尾有tab,第二行尾有空格
[root@node2 Desktop]# diff test3.txt test4.txt
1,2c1,2
< aaaaaa
< bbbbbb
---
> aaaaaa
> bbbbbb
[root@node2 Desktop]# diff -Z test3.txt test4.txt
[root@node2 Desktop]# diff -b test3.txt test4.txt
[root@node2 Desktop]# diff -w test3.txt test4.txt
[root@node2 Desktop]#
## test5.txt第一行中间有tab,第二行有一个空格
[root@node2 Desktop]# diff test5.txt test6.txt
1,3c1,3
< aaa aaa
< bbb bbb
< ccc ccc
---
> aaaaaa
> bbbbbb
> ccc ccc
[root@node2 Desktop]# diff -Z test5.txt test6.txt
1,3c1,3
< aaa aaa
< bbb bbb
< ccc ccc
---
> aaaaaa
> bbbbbb
> ccc ccc
[root@node2 Desktop]# diff -b test5.txt test6.txt
1,2c1,2
< aaa aaa
< bbb bbb
---
> aaaaaa
> bbbbbb
[root@node2 Desktop]# diff -w test5.txt test6.txt
[root@node2 Desktop]#
忽略空格输出说明:
- -Z 是忽略行尾的空格或tab,空格/tab在中间的不能忽略
- -b 忽略空白量,即多个空格相当于一个空格
- -w 忽略所有空格,包括行中间或者行尾
4.2.3.忽略空行对比(-B)
[root@node2 Desktop]# cat test7.txt
aaaaaa
bbbbbb
cccccc
[root@node2 Desktop]# cat test8.txt
aaaaaa
bbbbbb
cccccc
[root@node2 Desktop]# diff test7.txt test8.txt
2d1
<
4d2
<
[root@node2 Desktop]# diff -B test7.txt test8.txt
[root@node2 Desktop]#