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
描述
如果指定了 Directory1 和 Directory2 参数,diff 命令比较两个目录下名称相同的文本文件。 列示不同的二进制文件、公共子目录和只在一个目录出现的文件。
当 diff 命令运行于常规文件时,且当目录比较期间比较不同的文本文件时,diff 命令显示文件中哪些行必须更改以保持它们一致。 如果 File1 和 File2 参数都不是目录,其中之一可能给定减号“-”,以采用标准输入。 如果 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 命令下,相同的对(即 Number1 = Number2 )会简略为单个数字。
在每行之后, 迪夫 命令将显示第一个文件中受影响的所有行,前面有 <: (小于号,冒号) ,然后显示第二个文件中受影响的所有行,前面有 > (大于号)。
退出值 0 表示没有不同,1 表示找到不同处,2 表示出错。
标志
| 项 | 描述 |
|---|---|
| -b | 将每行末尾当作单个新行标记处理(忽略新行字符前的空格字符)的任意数量空格字符与其他空格字符串(除了新行标记)同样地比较。 |
| -C 行 | 生成 diff 命令对若干复制上下文行的比较,上下文行数等于 Lines 变量指定的值。 -c 标志稍微修改输出。 输出以所涉及文件的标识和创建日期开始。 每一次变化都用一条条线隔开*(星号)。 从 File1 中除去的行被标记为-(减号) 并且添加到 File2 的那些文件将以+(加号)。 从一个文件更改为另一个文件的行在两个文件中都被标记为!(感叹号)。 在指定的复制上下文行中的更改会组合到一起作为输出。 |
| -c | 生成 diff 命令对 3 行复制上下文的比较。 -c 标志稍微修改输出。 输出以所涉及文件的标识和创建日期开始。 每一次变化都用一条条线隔开*(星号)。 从 File1 中除去的行被标记为-(减号) 并且添加到 File2 的那些文件将以+(加号)。 从一个文件更改为另一个文件的行在两个文件中都被标记为!(感叹号)。 在指定的复制上下文行中的更改会组合到一起作为输出。 |
| -D [ 字符串 ] | 使得 diff 命令在标准输出中建立 一个 File1 和 File2 的合并版本。 包含了 C 预处理器控件以便没有 定义 String 的结果编译等同于 编译 File1,同时定义 String 产生 File2。 |
| -e | 以适合
ed 编辑器的格式进行输出,将 File1 转换成
File2。 当使用此标志时,以下 shell 程序可以帮助维护一个文件的多个版本。 仅祖代文件 ($1) 和版本到版本的链 ed 脚本 ($2, $3...) 需要使用 diff 命令。 标准输出中的最近版本如下所示:当使用 -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 标志只用于 Directory1 和 Directory2 参数指定的目录。 如果您将 -r 标志与 -S 标志一起使用,-S 标志在 Directory1 和 Directory2 子目录中不进行递归。 |
| -t | 在输出行扩展制表符。 典型输出或者 -c 标志输出会添加字符到每一行首,这会影响初始行的缩进,使得输出列表难以解释。 该标志则保留原始源的缩进。 |
| -U | 生成 diff 命令对 3 行统一上下文的比较。 输出类似 -c 标志的输出,但其上下文行不会重复;上下文、删除行和添加行会以交错方式一起显示。 |
| -U 行 | 生成 diff 命令针对若干统一上下文行的比较,上下文行数等于 Lines 变量指定的值。 输出类似 -c 标志的输出,但其上下文行不会重复;上下文、删除行和添加行会以交错方式一起显示。 |
| -w | 忽略所有空格和制表符,将所有其他空白字符串视为一致。 例如,if ( a == b )等值比较if(a==b). |
退出状态
本命令返回以下退出值:
| 项 | 描述 |
|---|---|
| 重大安全事件数量 | 未找到不同处。 |
| 第 1 年 | 找到不同处。 |
| > 1 | 发生错误。 |
示例
- 要比较两个文件,请输入:
这将显示文件之间的差异chap1.bak和chap1.diff chap1.back chap1 - 要比较两个文件而忽略空格量的差异,请输入:diff -w prog.c.bak prog.c如果两行仅仅空格和制表符数目不同,那么 diff -w 命令认为它们相等。
- 要创建包含 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 命令。 |