一、命令简介
Linux diff命令用于比较文件的差异。diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。diff的输出结果表明需要对一个文件做怎样的操作之后才能与第二个文件相匹配。diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。
二、使用示例
0、查看两个待比较文件
[root@test1 tmp]# cat file1.txt
君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。
[root@test1 tmp]# cat file2.txt
君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
1、使用默认normal模式比较
[root@test1 tmp]# diff file1.txt file2.txt
5,6c5
< 陈王昔时宴平乐,斗酒十千恣欢谑。
< 主人何为言少钱,径须沽取对君酌。
烹羊宰牛且为乐,会须一饮三百杯。
2、使用context模式比较
[root@test1 tmp]# diff -c file1.txt file2.txt
*** file1.txt 2021-06-09 09:40:39.776160512 +0800
— file2.txt 2021-06-09 09:31:43.743508119 +0800
***************
*** 2,6 ****
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
! 陈王昔时宴平乐,斗酒十千恣欢谑。
! 主人何为言少钱,径须沽取对君酌。
— 2,5 ----
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
! 烹羊宰牛且为乐,会须一饮三百杯。
3、使用Unified模式比较
[root@test1 tmp]# diff -u file1.txt file2.txt
— file1.txt 2021-06-09 09:40:39.776160512 +0800
+++ file2.txt 2021-06-09 09:31:43.743508119 +0800
@@ -2,5 +2,4 @@
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
-陈王昔时宴平乐,斗酒十千恣欢谑。
-主人何为言少钱,径须沽取对君酌。
+烹羊宰牛且为乐,会须一饮三百杯。
4、并排输出比较结果
[root@test1 tmp]# diff -y -W 200 file1.txt file2.txt
"|"表示前后2个文件内容有不同
"<"表示后面文件比前面文件少了1行内容
">"表示后面文件比前面文件多了1行内容
5、目录比较
[root@test1 home]# cp -r wuhs wuhs2
[root@test1 home]# rm -rf wuhs2/Videos
[root@test1 home]# diff -r -q wuhs wuhs2
Only in wuhs: Videos
[root@test1 home]# cp /tmp/file1.txt wuhs2/
[root@test1 home]# diff -r -q wuhs wuhs2
Only in wuhs2: file1.txt
Only in wuhs: Videos
6、比较时忽略空白行
-B参数忽略空白行,经测试只忽略后面文件的空白行。
[root@test1 tmp]# diff -B file1.txt file2.txt
5,6c7
< 陈王昔时宴平乐,斗酒十千恣欢谑。
< 主人何为言少钱,径须沽取对君酌。
—
烹羊宰牛且为乐,会须一饮三百杯。
[root@test1 tmp]# cat file2.txt
君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
7、使用-e和ed同步file2内容到file1
[root@test1 tmp]# cat file2.txt
君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
[root@test1 tmp]# diff -e file1.txt file2.txt > script.txt
[root@test1 tmp]# cat script.txt
5,6c
烹羊宰牛且为乐,会须一饮三百杯。
.
2a
.
[root@test1 tmp]# echo “w” >> script.txt
[root@test1 tmp]# ed - file1.txt < script.txt
[root@test1 tmp]# cat file1.txt
君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。
人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。
三、使用语法及参数说明
1、使用语法
用法:diff [参数]… 文件
2、参数说明
参数 | 参数说明 |
---|---|
–normal | 默认输出模式 |
-q, --brief | 仅显示有无差异,不显示详细的信息。 |
-s, --report-identical-files | 若没有发现任何差异,仍然显示信息。 |
-c, -C NUM, --context[=NUM] | Context模式,显示全部内文,并标出不同之处。 |
-u, -U NUM, --unified[=NUM] | Unified模式,以合并的方式来显示文件内容的不同。 |
-e, --ed | 此参数的输出格式可用于ed的script文件。 |
-n, --rcs | 将比较结果以RCS的格式来显示。 |
-y, --side-by-side | 以并列的方式显示文件的异同之处。 |
-W, --width=NUM | 在使用-y参数时,指定栏宽。 |
-p, --show-c-function | 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。 |
-t, --expand-tabs | 在输出时,将tab字符展开。 |
-T, --initial-tab | 在每行前面加上tab字符以便对齐。 |
-l, --paginate | 将结果交由pr程序来分页。 |
-r, --recursive | 比较子目录中的文件。 |
-N, --new-file | 在比较目录时,若文件A仅出现在某个目录中,预设会显示。 |
-x, --exclude=PAT | 不比较选项中所指定的文件或目录 |
-X, --exclude-from=FILE | 不比较选项中所指定的文件或目录 |
-S, --starting-file=FILE | 在比较目录时,从指定的文件开始比较。 |
-i, --ignore-case | 不检查大小写的不同。 |
-w, --ignore-all-space | 忽略全部的空格字符。 |
-B, --ignore-blank-lines | 不检查空白行。 |
-I, --ignore-matching-lines=RE | 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。 |
-a, --text | diff预设只会逐行比较文本文件 |
-D, --ifdef=NAME | 此参数的输出格式可用于前置处理器巨集。 |
-d, --minimal | 使用不同的演算法,以较小的单位来做比较。 |
–help | 获取命令帮助 |
-v, --version | 查看命令版本 |