1.命令简介

diff(different)命令是以逐行的方式,比较文本文件的异同。

如果给定的文件名是 -,表示从标准输入读取内容。如果给定的文件是目录,则将会比较该目录中具有相同文件名的文件,默认情况下不会对其子目录文件进行任何比较操作。

由于历史原因,diff 有四种输出格式:

正常格式(选项 --normal )
并列格式(选项 -y, --side-by-side)
上下文格式(选项 -C NUM, -c, --context[=NUM])
合并格式(选项 -U NUM, -u, --unified[=NUM])

2.命令格式

diff [OPTION]... FILES

FILES 取值形式有如下几种:

FILE1 FILE2
DIR1 DIR2
DIR FILE
FILE DIR

FILES 除了上面的几种取值形式,也可以使用选项 --from-file(指定第一个文件)或 --to-file(指定第二个文件)。如果输入相同,退出状态为 0;如果输入不同,则为 1;如果出现故障,则为 2。

3.选项说明

注意,长选项的强制性参数对于短选项也是强制的。

-a, --text所有的文件都视为文本文件来逐行比较
-B, --ignore-blank-lines忽略插入删除空行引起的变化
-b, --ignore-space-change忽略因空白符数量不同造成的差异
-C NUM
-c, --context[=NUM]使用上下文格式输出,显示异行处上下指定数量的行(默认为 3 行)--color[=WHEN]将输出着色;WHEN 可取值 never、always 或 auto(默认值)
-D, --ifdef=NAME输出与 "#ifdef NAME" 不同的合并文件
-d, --minimal改变算法找出一组更小的变更。这会使 diff 变慢
-E, --ignore-tab-expansion忽略因 Tab 扩展引起的更改
-e, --ed输出为一个有效的 ed 脚本
-F, --show-function-line=RE显示匹配 RE 的前面的行
--from-file=FILE1将 FILE 1 与所有文件进行比较;FILE 1 可以是一个目录
--GTYPE-group-format=GFMT用组格式 GFMT 格式化类型为 GTYPE 的输入组
--line-format=LFMT用格式 LFMT 格式化所有输入行
--LTYPE-line-format=LFMT用行格式 LFMT 格式化类型为 LTYPE 的输入行上面三个选项和响应的格式提供了对输出的细粒度控制。行类型 LTYPE 可取值 old、new 或 unchanged,组类型 GTYPE 可取值 LTYPE 或 changed。组格式 GFMT 特含如下内容:%< FILE1 中的行%> FILE2 中的行%= FILE1 和 FILE2 中共有的行%[-][WIDTH][.[PREC]]{doxX}LETTER使用 printf 输出风格修饰 LETTER,LETTER 使用如下字母表示新组,下面的小写字母表示旧组F    首行行号L   尾行行号N   行数 = L-F+1E   等于 F-1M 等于 L+1%(A=B?T:E)if A equals B then T else E行格式 LFMT  特含如下内容:%L 行的内容%l  行的内容,不包括任何尾随的换行符%[-][WIDTH][.[PREC]]{doxX}n使用 printf 风格修饰输入行号 n组格式 GFMT 和行格式 LFMT 共有的内容:%%            表示百分号 %%c'C'      表示大写字母 C%c'\OOO'  表示码值为八进制 000 的字符C           其他字符
--help显示帮助信息并退出
--horizon-lines=NUM保持共有前缀和后缀的 NUM 行
-I, --ignore-matching-lines=RE忽略匹配正则表达式 RE 的行
-i, --ignore-case忽略大小写
--ignore-file-name-case比较文件名时忽略大小写
-l, --paginate将结果交由 pr 程序来分页
--label LABEL输出比较结果时使用 LABEL 代替文件名和时间戳
--left-column只输出公共行的左列
-N, --new-file将缺席文件视为空文件。在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录:文件 A。若使用 -N 参数,则 diff 会将文件 A 与一个空白的文件比较
-n, --rcs将比较结果以 RCS 的格式来显示
--no-dereference不解析
--no-ignore-file-name-case比较文件名时大小写敏感
--normal使用正常格式输出比较结果。为默认输出格式
-p, --show-c-function显示每个更改在哪个 C 函数中
--palette=PALETTE当使用选项 --color 时,指定要使用的颜色。PALETTE 是使用冒号分隔的终端支持的能力列表
-q, --brief仅报告文件是否相异,忽略差别的细节
-r, --recursive当比较目录时,递归比较子目录
-S, --starting-file=FILE当比较目录时,由 FILE 开始。这用于继续中断的比较
-s, --report-identical-files当两个文件相同时报告
--speed-large-files使用启发规则加速操作那些有许多离散的小差异的大文件
--strip-trailing-cr去掉输入行尾的回车符 CR
--suppress-common-lines在并列格式中不印出公共行
-T, --initial-tab在每行前面加上 Tab 以便对齐
-t, --expand-tabs在输出时将 Tab 扩展为空格
--tabsize=NUM一个 Tab 表示 NUM(默认 8) 个空格
--to-file=FILE2将所有文件与 FILE2 进行比较;FILE2 可以是一个目录
-U NUM
-u, --unified[=NUM]使用合并格式输出,输出 NUM(默认 3)行的统一上下文
--unidirectional-new-file将缺席的第一批文件视为空文件
-v, --version输出版本信息并退出
-W, --width=NUM使用 -y 选项采用列格式输出时,指定栏宽。缺省为 130
-w, --ignore-all-space在比较行的时候忽略空白符
-y, --side-by-side使用并格式输出两列-Z, --ignore-trailing-space忽略行尾的空白符

4.常用示例

给定测试文件 file1 和 file2,其内容为十二生肖中动物的英文。
file1 内容:

mouse
cattle
tiger
rabbit
dragon
snake
horse
sheep
monkey
chicken
dog
pig

file2 内容:

mouse
cattle
tigerrabbit
dragon
snake
h orse
sheeps
monkey
chicken

(1)比较两个文件的异同,使用正常格式输出。

diff file1 file2
4c4
< rabbit
---
>    rabbit
7,8c7,8
< horse
< sheep
---
> h orse
> sheeps
11,12d10
< dog
< pig

diff 的正常输出格式有三种提示:

a - add
c - change
d - delete

因此可以看出,上面的输出中 3c3 和 7,8c7,8 表示两者在 3、7 和 8 行内容有所不同;11,12d10 表示后者比前者少了 11 和 12 行。

特殊字符 < 表示该行属于第一个文件,> 表示该行属于第二个文件,— 为分隔符。

(2)比较两个文件的异同,使用并列格式输出,并指定列宽为 50。

diff -y -W50 file1 file2


其中特殊字符的含义如下:

| 表示前后 2 个文件内容有不同
< 表示后面文件比前面文件少了 1 行内容
> 表示后面文件比前面文件多了 1 行内容

(3)比较两个文件的异同,使用上下文格式输出,并只显示异行处上下各一行上下文。

diff -C1 file1 file2
*** file1   Sat Feb 15 22:24:46 2020
--- file2   Sat Feb 15 22:29:26 2020
***************
*** 3,12 ****tiger
! rabbitdragonsnake
! horse
! sheepmonkeychicken
- dog
- pig
--- 3,10 ----tiger
!   rabbitdragonsnake
! h orse
! sheepsmonkeychicken

这种方式在开头两行作了比较文件的说明,这里有三种特殊字符:

-    出现在前者,表示后者比前者少一行
+  出现在后者,表示后者比前者多一行
!   出现在两者,表示有差别的行

(4)比较两个文件的异同,使用合并格式输出,并只显示异行处上下各一行上下文。

diff -U1 file1 file2
--- file1   2020-02-15 22:24:46.522867000 +0800
+++ file2    2020-02-15 22:29:26.686867000 +0800
@@ -3,10 +3,8 @@tiger
-rabbit
+  rabbitdragonsnake
-horse
-sheep
+h orse
+sheepsmonkeychicken
-dog
-pig

第一部分,也是文件的基本信息。— 表示第一个文件,+++ 表示第二个文件。
第二部分,@@包围的内容,其中 -3,10 表示输出的内容属于第一个文件的 3 至 10 行,+3,8 表示输出的内容属于第二个文件的 3 至 8 行。
第三部分,为比较后合并的内容。减号 - 表示后者比前者少了该行,加号表示后者比前者多了该行。

(5)比较时忽略空白字符(Tab、空格),使用正常格式输出。

diff -w file1 file2
8c8
< sheep
---
> sheeps
11,12d10
< dog
< pig

可以发现,后者包含 Tab 的 rabbit 行和空格的 horse 行与前者比较时属于相同行。

(6)比较文件夹中同名文件的不同,使用正常格式输出。

ll dir1
total 4
-rw-r--r-- 1 root root  0 Feb 16 00:24 a.txt
-rw-r--r-- 1 root root 74 Feb 15 22:24 filell dir2
total 4
-rw-r--r-- 1 root root  0 Feb 16 00:24 b.txt
-rw-r--r-- 1 root root 69 Feb 15 22:29 filediff dir1 dir2
Only in dir1: a.txt
Only in dir2: b.txt
diff dir1/file dir2/file
4c4
< rabbit
---
>    rabbit
7,8c7,8
< horse
< sheep
---
> h orse
> sheeps
11,12d10
< dog
< pig

参考文献

[1] diff(1) manual
[2] 每天一个Linux命令目录
[3] 每天一个Linux命令.diff 命令
[4] Linux 命令手册.diff 命令

Linux 命令(119)—— diff 命令相关推荐

  1. linux diff命令_Linux diff命令示例

    linux diff命令 The Linux diff command analyses a file line by line and gives an output of a list of ch ...

  2. Linux命令之diff命令

    一.命令简介   Linux diff命令用于比较文件的差异.diff以逐行的方式,比较文本文件的异同处.如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录.diff的输 ...

  3. 【Linux基础】 diff命令的参数详解和实例

    diff命令参数: diff - 找出两个文件的不同点 总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - ...

  4. Linux 的 diff 命令

    读懂 diff:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html 菜鸟教程:https://www.runoob.com/lin ...

  5. Linux之diff命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  6. linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分

    如果你需要比较系统文件的内容,那么你就会是使用到diff命令,可找出文件之间相同的部分,下面小编就给大家详细介绍下Linux diff命令的用法. diff 命令是 linux上非常重要的工具,用于比 ...

  7. Linux文本比较命令:diff

    diff 命令 diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件 ...

  8. 每天一个linux命令(36):diff 命令

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  9. linux命令之diff,whereis,locate,pwd,cat,grep,touch,find

    最近学到的linux命令,算是每天学一个,但是感觉每天都在忘...所以就只能重复的看了,在此分享给大家.与君共勉. 1. diff::比较给定的两个文件的不同    diff /usr/li test ...

最新文章

  1. K单体型重建算法的研究
  2. 快讯 | 第三届数据标准化及治理优秀评选顺利结束
  3. 深度研报:六大视角解读人工智能,AI岂止于技术
  4. .Net转Java.02.数据类型
  5. 解决mybatis中#{}导致的The error may involve defaultParameterMap的问题
  6. MessagePack:一种高效二进制序列化格式
  7. vue .prettierrc文件常见配置, 以及配置 Prettier - Code formatter 插件 格式化
  8. java分页代码思路,记录--java 分页 思路 (hibernate关键代码)
  9. 剖析 AI 和大数据的分布式实践 —— 2018 UCan下午茶·北京站
  10. cad画流程图的插件_PIDCAD工艺流程图绘图软件
  11. 快速刷通PWN的第一天
  12. win7屏幕亮度怎么调_win7屏幕亮度调整方法
  13. 分享自己的页游运维架构
  14. 农产品食品检验员职业能力证书含金量高吗?在哪报名?
  15. 基于中点算法和Bresenham算法绘制椭圆
  16. Oracle11g RAC在一个节点宕掉的情况下添加一个新的节点:
  17. 高中数学,向量高考真题解题技巧(快速口算)
  18. windows蓝屏代码含意全集
  19. php招生信息网代码,基于PHP招生管理信息系统
  20. Dispatch barriers处理读与写的冲突

热门文章

  1. Codeforces Round #542(Div. 2) B.Two Cakes
  2. Python的那些隐藏特性
  3. mac osx vi 设置tab 四个空格
  4. 学习成为一个IT架构师
  5. 如果你不懂备案,那我简单点跟你说
  6. 推荐背单词最有效的方法:使用艾宾浩斯记忆曲线背单词
  7. Step by Step-构建自己的ORM系列-索引
  8. VMware HA实战攻略之一软硬件环境准备
  9. python压缩和读取.tar.bz2格式的压缩包
  10. c语言 mysql 查询数字_使用mysql C语言API编写程序—MYSQL数据库查询操作