diff 命令

用途

比较文本文件。

语法

要比较两个文件的内容,请输入:

迪夫 [ -c| -C | -D [ 字符串 ] | -e | -f | -n | | -U ] [ -b ] [ -我 ] [ -t ] [ -w ] File1 File2

diff [ -h ] [ -b ] File1 File2

要对目录内容进行排序并比较不同的文件,请输入:

diff [ -c | -C Lines | -e | -f | -n | -u | -U Lines ] [ -b ] [ -i ] [ -l ] [ -r ] [ -s ] [ -S File ] [ -t ] [ -w ] Directory1 Directory2

diff [ -h ] [ -b ] Directory1 Directory2

描述

diff 命令比较文本文件。 它可以比较单个文件或者目录的内容。
注: diff 命令只处理作为文本文件的输入文件。

如果指定了 Directory1 Directory2 参数,diff 命令比较两个目录下名称相同的文本文件。 列示不同的二进制文件、公共子目录和只在一个目录出现的文件。

diff 命令运行于常规文件时,且当目录比较期间比较不同的文本文件时,diff 命令显示文件中哪些行必须更改以保持它们一致。 如果 File1File2 参数都不是目录,其中之一可能给定减号“-”,以采用标准输入。 如果 File1 参数是目录,那么使用目录中 与 File2 参数指定的文件名一致的那个文件。

典型的输出包含这些格式的行:

Lines Affected in File1   Action        Lines Affected in File2
Number1                   a             Number2[,Number3]
Number1[,Number2]         d             Number3
Number1[,Number2]         c             Number3[,Number4] 

这些行类似于 ed 子命令 将 File1 文件转换成 File2 文件。 Action 字母之前的数字指 File1 ;后面的数字则指 File2。 因此,通过将 a 替换成 d,从右往左读,您就能知道如何将 File2 转换成 File1。 在 ed 命令下,相同的对(即 Number1Number2 )会简略为单个数字。

在每行之后, 迪夫 命令将显示第一个文件中受影响的所有行,前面有 <: (小于号,冒号) ,然后显示第二个文件中受影响的所有行,前面有 > (大于号)。

退出值 0 表示没有不同,1 表示找到不同处,2 表示出错。

注: 如果指定了多个 -c-C-D-e-f-n-u-U 标志,那么命令行上的最后一个标志优先。 系统不发出错误消息。

标志

描述
-b 将每行末尾当作单个新行标记处理(忽略新行字符前的空格字符)的任意数量空格字符与其他空格字符串(除了新行标记)同样地比较。
-C 生成 diff 命令对若干复制上下文行的比较,上下文行数等于 Lines 变量指定的值。 -c 标志稍微修改输出。 输出以所涉及文件的标识和创建日期开始。 每一次变化都用一条条线隔开*(星号)。 从 File1 中除去的行被标记为-(减号) 并且添加到 File2 的那些文件将以+(加号)。 从一个文件更改为另一个文件的行在两个文件中都被标记为!(感叹号)。 在指定的复制上下文行中的更改会组合到一起作为输出。
-c 生成 diff 命令对 3 行复制上下文的比较。 -c 标志稍微修改输出。 输出以所涉及文件的标识和创建日期开始。 每一次变化都用一条条线隔开*(星号)。 从 File1 中除去的行被标记为-(减号) 并且添加到 File2 的那些文件将以+(加号)。 从一个文件更改为另一个文件的行在两个文件中都被标记为!(感叹号)。 在指定的复制上下文行中的更改会组合到一起作为输出。
-D [ 字符串 ] 使得 diff 命令在标准输出中建立 一个 File1File2 的合并版本。 包含了 C 预处理器控件以便没有 定义 String 的结果编译等同于 编译 File1,同时定义 String 产生 File2
-e 以适合 ed 编辑器的格式进行输出,将 File1 转换成 File2。 当使用此标志时,以下 shell 程序可以帮助维护一个文件的多个版本。 仅祖代文件 ($1) 和版本到版本的链 ed 脚本 ($2$3...) 需要使用 diff 命令。 标准输出中的最近版本如下所示:
(shift; cat $*; echo '1,$p') | ed - $1
当使用 -e 标志比较目录时,输出上添加了额外的命令, 因此,结果是一个 shell 脚本,将两个目录上的共有文本文件 从 Directory1 上的状态转换到 Directory2 上的状态。
注意: 编辑由 -e-f 标志生成的脚本不能创建由单个组成的行。 :NONE.
-f 以不适合与 ed 编辑器配合使用的格式生成输出,显示将 File1 转换为 File2 所需的修改,其顺序与在 -e 标志下生成的顺序相反。
-h 如果要更改的部分比较短而且分隔清晰,那么执行备用的比较可能会更快。 -h 标志可用于任意长度的文件。 -c-C -D-e -f-n 标志无法与 -h 标志一起使用。 当使用 -h 标志时,除了 -b 标志,其他标志一律忽略。
-i 忽略字母大小写。 例如,小写 a 被认为同大写 A 一样。
-l 长输出格式。 每个由文本文件比较 diff 命令 获得的结果通过命令 pr 输送 分页。 在报告所有文本文件不同之处后,其他不同之处将被记忆和总结。
-n 产生类似于 -e 标志创建的输出,但是顺序相反,而且在每一插入或删除命令上进行更改计数。 这是修订控件系统 (RCS) 所用的格式。
-r 使 diff 命令的应用程序递归到遇到的公共子目录。
-s 报告相同的文件,否则不提。
-S [ 文件 ] 当比较目录时,忽略在 File 变量指定的文件之前整理名称的文件。 -S 标志只用于 Directory1Directory2 参数指定的目录。 如果您将 -r 标志与 -S 标志一起使用,-S 标志在 Directory1Directory2 子目录中不进行递归。
-t 在输出行扩展制表符。 典型输出或者 -c 标志输出会添加字符到每一行首,这会影响初始行的缩进,使得输出列表难以解释。 该标志则保留原始源的缩进。
-U 生成 diff 命令对 3 行统一上下文的比较。

输出类似 -c 标志的输出,但其上下文行不会重复;上下文、删除行和添加行会以交错方式一起显示。

-U 生成 diff 命令针对若干统一上下文行的比较,上下文行数等于 Lines 变量指定的值。 输出类似 -c 标志的输出,但其上下文行不会重复;上下文、删除行和添加行会以交错方式一起显示。
-w 忽略所有空格和制表符,将所有其他空白字符串视为一致。 例如,if ( a == b )等值比较if(a==b).

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 未找到不同处。
第 1 年 找到不同处。
> 1 发生错误。

示例

  1. 要比较两个文件,请输入:
    diff chap1.back chap1
    这将显示文件之间的差异chap1.bakchap1.
  2. 要比较两个文件而忽略空格量的差异,请输入:
    diff  -w prog.c.bak prog.c
    如果两行仅仅空格和制表符数目不同,那么 diff -w 命令认为它们相等。
  3. 要创建包含 ed 命令可用于从另一个文件重构的命令的文件,请输入:
    diff  -e chap2 chap2.old >new.to.old.ed
    这将创建一个名为new.to.old.ed包含要更改的 ed 子命令chap2返回到在其中找到的文本版本chap2.old在大多数情况下,new.to.old.ed是一个比文件小得多的文件chap2.old。可以通过删除来节省磁盘空间chap2.old,您可以随时通过输入:
    (cat new.to.old.ed ; echo '1,$p') | ed - chap2 >chap2.old
    括号中的命令添加1,$p发送到 ed 编辑器的编辑命令的末尾。 该1,$p使 ed 命令在编辑该文件后将其写入标准输出。 然后,将此修改后的命令序列通过管道传送到 ed 命令 (| ed) ,编辑器将其读取为标准输入。 - 标志导致 ed 命令不显示文件大小和其他额外信息,因为它将与chap2.old.

文件

描述
/usr/bin/diff 包含 diff 命令。