手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

diff(1)

名称

diff - 比较两个文件

用法概要

diff [-bitw] [-c | 
-e | -f | -h | -n | 
-u] file1 file2
diff [-bitw] [-C 
number | -U number] 
file1 file2
diff [-bitw] [-D 
string] file1 file2
diff [-bitw] [-c | 
-e | -f | -h | -n | 
-u] [-l] [-r] [-s] 
     [-S name] directory1
 directory2

描述

diff 实用程序可比较 file1 file2 的内容,并向标准输出写入将 file1 转换为 file2 所必需的一组更改。此列表包括最低限度的差异。除了在罕见的情形中以外,diff 会找到最低限度的足够的文件差异。如果文件完全相同,则不会有任何输出。

常规输出包含三种形式的行:

n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4

其中 n1n2 代表 file1 中的行,n3n4 代表 file2 中的行。这些行比较 ed(1) 命令以将 file1 转换为 file2。通过用 a 交换 d 并向后读取,可将 file2 转换为 file1。像在 ed 中一样,完全相同的对(其中 n1= n2 或者 n3=n4)被缩写成一个数字。

在其中的每个行后面是  <  标记的第一个文件中受影响的所有行,然后是  >   标记的第二个文件中受影响的所有行。

选项

支持以下选项:

–b

忽略尾随空白(空格或制表符),并将其他空白字符串视为等效。

–i

忽略字母大小写。例如,A 比较等同于 a

–t

展开输出文件中的 TAB 字符。常规或 –c 输出将字符添加到每行的前面,这可能会对原来的源行的缩排产生不利影响,使得输出行难以解释。此选项保留原来的源的缩排。

–w

忽略所有空白(SPACE 和 TAB 字符),并将其他所有空白字符串视为等效。例如,`if ( a = = b )' 比较等同于 `if(a= =b)'。

以下选项是互斥的:

–c

产生一个差异列表以及三行上下文。使用此选项时,会对输出格式进行少量更改。即,输出的开头会指示涉及的文件及其创建日期,每个更改用一个带星号 * 的行分隔。从 file1 中删除的行带 — 标记。添加到 file2 的行带  +  标记。从一个文件更改到另一个文件的行在两个文件中都带  !  标记。

–C number

产生的差异列表与 –c 产生的完全相同,但包含 number 行上下文。

–D string

创建一个合并版的 file1file2,并包含 C 预处理程序控制,因此在不定义 string 的情况下编译结果等效于编译 file1,如果同时定义 string,则可获得 file2

–e

为编辑器 ed 生成一个仅包含 acd 命令的脚本,该脚本可根据 file1 重新创建 file2。结合使用 –e 选项,以下 shell 程序可以帮助维护一个文件的多个版本。只需要有一个祖先文件 ($1) 和一个由 diff 生成的表示版本间差异的 ed 脚本链 ($2,$3,...)。最新版本就会显示在标准输出上。

(shift; cat $*; echo ´1,$p') | ed − $1
–f

按相反顺序生成类似的脚本(不与 ed 结合使用)。

–h

进行快速的常规作业。

此选项仅适合更改的片段很短并且分离出来的情况。它对长度无限的文件无效。

只有 -–b 可与 –h 一起使用。

使用此选项时,diff 不会深入到目录。

–n

产生一个类似于 –e 的脚本,但采用相反的顺序,并对每个插入或删除命令进行更改行计数。

–u

产生一个差异列表以及三行上下文。输出类似于 –c 选项的输出,但上下文是“统一的”。file1 中删除和更改的行加上标记 -file2 中增加或更改的行加上标记 +。输出中会显示两个版本的更改行,但添加、删除和上下文行仅出现一次。file1file2 的标识方法不同:使用 –c 选项时显示 “***” 和 “−−−” 的位置会输出 “−−−” 和 “+++”。每项更改都用以下形式的一行单独显示:

@@ -n1,n2 +
n3,n4 @@
–U number

产生的差异列表与 –u 产生的完全相同,但包含 number 行上下文。

以下选项用于比较目录:

–l

产生长格式的输出。在执行 diff 之前,每个文本文件通过 pr(1) 进行分页。会记录其他差异并在报告了所有文本文件差异后汇总这些差异。

–r

以递归方式将 diff 应用于遇到的共用子目录。

–s

报告完全相同的文件。这些完全相同的文件不会再提及。

–S name

在中间开始对目录执行 diff,以文件名 name 开始。

操作数

支持下列操作数:

file1
file2

要比较的文件或目录的路径名。如果 file1file2,则在其位置使用标准输入。

directory1
directory2

要比较的目录的路径名。

如果 file1file2 中只有一个是目录,则 diff 将应用于非目录文件以及目录文件中文件名与非目录文件最后一个组成部分相同的文件。

用法

有关 awk 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

示例 1 使用 diff 命令

在以下命令中,dir1 是一个包含目录 x 的目录,dir2 是一个包含目录 xdir1/xdir2/x 的目录,两者都包含文件 date.outdir2/x 包含文件 y

example% diff -r dir1 dir2
Common subdirectories: dir1/x and dir2/x

Only in dir2/x: y

diff -r dir1/x/date.out dir2/x/date.out

1c1

< Mon Jul  2 13:12:16 PDT 1990

---

> Tue Jun 19 21:41:39 PDT 1990

环境变量

有关影响 diff 执行的以下环境变量的说明,请参见 environ(5):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES、LC_TIME 和 NLSPATH。

TZ

确定语言环境,该设置影响使用 –C–c 选项时用于计算写入的文件时间戳的时区。

退出状态

将返回以下退出值:

0

未找到差异。

1

找到了差异。

>1

出现错误。

文件

/tmp/d?????

用于比较的临时文件

/usr/lib/diffh

用于 –h 选项的可执行文件

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

bdiff(1)cmp(1)comm(1)dircmp(1)ed(1)pr(1)sdiff(1)attributes(5)environ(5)largefile(5)standards(5)

附注

使用 –e–f 选项产生的编辑脚本在创建包含单个句点 (.) 的行方面还不成熟。

在文件结尾缺少 NEWLINE 表示相关文件的最后一行没有 NEWLINE。如果行不同,则会对其标记并输出,但输出似乎会指示行相同。