欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


Linux环境中远程开启ssh端口和更改ssh用户根目录
三种新建WPS文字格式文件的方法
Linux中安装sosreport和supportconfig来收集系统信息
爱剪辑相框怎么使用
Linux命令提示符如何按照自己的习惯修改?
Linux系统中管理用户和用户组的相关配置文件简介
Linux系统中的sudo命令使用讲解
excel修改背景图片的合适尺寸
联想笔记本从Win8升级Win8.1后桌面右下角提示SecureBoot未正确配置的处理方案
Linux系统下安装配置postfix邮件服务器教程
Linux下用于对比文件的diff命令使用教程
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   总览

  diff [选项] 源文件 目标文件

  描述

  在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, diff - - 比较一份标准输入的它自己的拷贝如果 源文件 是一个目录和 目标文件 不是(目录), diff 会比较在 源文件(目录) 里的文件的中和 目标文件同名的(文件), 反过来也一样. 非目录文件不能是 -. 如果 源文件 和 目标文件 都是目录, diff 比较两个目录中相应的文件,依照字母次序排序;这个比较是不会递归的,除非给出 -r 或者 --recursive. diff 不把一个目录的内容看为它是一个文件来比较。被指定的文件不能是标准的输入, 因为标准的输入是无名的并且"有一样的名字的文件"的观点不适用。 diff 的选项由 -, 开始所以正常地 源文件(名) 和 目标文件(名) 不可以用 - 开头. 然而, -- 可以被它视为保留的即使作为文件名的开头( they begin with -.)

  选项

  下面是 GNU所接受的 diff 的所有选项的概要. 大多数的选项有两个相同的名字,一个是单个的跟在 - 后面字母, 另一个是由 -- 引出的长名字. 多个单字母选项(除非它们产生歧义)能够组合为单行的命令行语法 -ac 是等同于 -a -c. 长命名的选项能被缩短到他们的名字的任何唯一的前缀. 用 ([ 和 ]) 括起来显示选项产生歧义的选项

  -行数(一个整数)

  显示上下文 行数 (一个整数). 这个选项自身没有指定输出格式,这是没有效果的,除非和 -c 或者 -u 组合使用. 这是已废置的选项,对于正确的操作, 上下文至少要有两行。

  -a

  所有的文件都视为文本文件来逐行比较,甚至他们似乎不是文本文件.

  -b

  忽略空格引起的变化.

  -B

  忽略插入删除空行引起的变化.

  --brief

  仅报告文件是否相异,在乎差别的细节.

  -c

  使用上下文输出格式.

  -C 行数(一个整数)

  --context[=lines]

  使用上下文输出格式,显示以指定 行数 (一个整数), 或者是三行(当 行数 没有给出时. 对于正确的操作, 上下文至少要有两行.

  --changed-group-format=format

  使用 format 输出一组包含两个文件的不同处的行,其格式是 if-then-else .

  -d

  改变算法也许发现变化的一个更小的集合.这会使 diff 变慢 (有时更慢).

  -D name

  合并 if-then-else 格式输出, 预处理宏(由name参数提供)条件.

  -e

  --ed

  输出为一个有效的 ed 脚本.

  --exclude=pattern

  比较目录的时候,忽略和目录中与 pattern(样式) 相配的.

  --exclude-from=file

  比较目录的时候,忽略和目录中与任何包含在 file(文件) 的样式相配的文件和目录.

  --expand-tabs

  在输出时扩展tab为空格,保护输入文件的tab对齐方式

  -f

  产生一个很象 ed 脚本的输出,但是但是在他们在文件出现的顺序有改变

  -F regexp

  在上下文和统一格式中,对于每一大块的不同,显示出匹配 regexp. 的一些前面的行.

  --forward-ed

  产生象 ed 脚本的输出,但是它们在文件出现的顺序有改变。

  -h

  这选项现在已没作用,它呈现Unix的兼容性.

  -H

  使用启发规则加速操作那些有许多离散的小差异的大文件.

  --horizon-lines=lines

  比较给定行数的有共同前缀的最后行,和有共同或缀的最前行.

  -i

  忽略大小写.

  -I regexp

  忽略由插入,删除行(由regexp 参数提供参考)带来的改变.

  --ifdef=name

  合并 if-then-else 格式输出, 预处理宏(由name参数提供)条件.

  --ignore-all-space

  在比较行的时候忽略空白.

  --ignore-blank-lines

  忽略插入和删除空行

  --ignore-case

  忽略大小写.

  --ignore-matching-lines=regexp

  忽略插入删除行(由regexp 参数提供参考).

  --ignore-space-change

  忽略空白的数量.

  --initial-tab

  在文本行(无论是常规的或者格式化的前后文关系)前输出tab代替空格. 引起的原因是tab对齐方式看上去象是常规的一样.

  -l

  产生通过 pr 编码的输出.

  -L label

  --label=label

  使用 label 给出的字符在文件头代替文件名输出.

  --left-column

  以并列方式印出两公共行的左边

  --line-format=format

  使用 format 输出所有的行,在 if-then-else 格式中.

  --minimal

  改变算法也许发现变化的一个更小的集合.这会使 diff 变慢 (有时更慢).

  -n

  输出 RC-格式 diffs; 除了每条指令指定的行数受影响外 象 -f 一样。

  -N

  --new-file

  在目录比较中,如果那个文件只在其中的一个目录中找到,那么它被视为在另一个目录中是一个空文件.

  --new-group-format=format

  使用 format 以if-then-else 格式输出只在第二个文件中取出的一个行组

  --new-line-format=format

  使用 format 以if-then-else 格式输出只在第二个文件中取出的一行

  --old-group-format=format

  使用 format 以if-then-else 格式输出只在第一个文件中取出的一个行组

  --old-line-format=format

  使用 format 使用 format 以if-then-else 格式输出只在第一个文件中取出的一行

  -p

  显示带有c函数的改变.

  -P

  在目录比较中,如果那个文件只在其中的一个目录中找到,那么它被视为在另一个目录中是一个空文件.

  --paginate

  产生通过 pr 编码的输出.

  -q

  仅报告文件是否相异,不报告详细的差异.

  -r

  当比较目录时,递归比较任何找到的子目录.

  --rcs

  输出 RC-格式 diffs; 除了每条指令指定的行数受影响外 象 -f 一样。

  --recursive

  当比较目录时,递归比较任何找到的子目录.

  --report-identical-files

  -s

  报告两个文件相同.

  -S file

  当比较目录时,由 file 开始. 这用于继续中断了的比较.

  --sdiff-merge-assist

  打印附加的信息去帮助 sdiff. sdiff 在运行 diff 时使用这些选项. 这些选项不是特意为使用者直接使用而准备的。

  --show-c-function

  显示带有c函数的改变.

  --show-function-line=regexp

  在上下文和统一的格式,对于每一大块的差别,显示出匹配 regexp. 的一些前面的行

  --side-by-side

  使用并列的输出格式.

  --speed-large-files

  使用启发规则加速操作那些有许多离散的小差异的大文件.

  --starting-file=file

  当比较目录时,由 file 开始. 这用于继续中断了的比较.

  --suppress-common-lines

  在并列格式中不印出公共行。

  -t

  在输出时扩展tab为空格,保护输入文件的tab对齐方式

  -T

  在文本行(无论是常规的或者格式化的前后文关系)前输出tab代替空格.引起的原因是tab对齐方式看上去象是常规的一样.

  --text

  所有的文件都视为文本文件来逐行比较,甚至他们似乎不是文本文件.

  -u

  使用统一的输出格式.

  --unchanged-group-format=format

  使用 format 输出两个文件的公共行组,其格式是if-then-else.

  --unchanged-line-format=format

  使用 format 输出两个文件的公共行,其格式是if-then-else.

  --unidirectional-new-file

  在目录比较中,如果那个文件只在其中的一个目录中找到,那么它被视为在另一个目录中是一个空文件.

  -U lines

  --unified[=lines]

  使用前后关系格式输出,显示以指定 行数 (一个整数), 或者是三行(当 行数 没有给出时. 对于正确的操作, 上下文至少要有两行.

  -v

  --version

  输出 diff 版本号.

  -w

  在比较行时忽略空格

  -W columns

  --width=columns

  在并列格式输出时,使用指定的列宽.

  -x pattern

  比较目录的时候,忽略和目录中与 pattern(样式) 相配的.

  -X file

  比较目录的时候,忽略和目录中与任何包含在 file(文件) 的样式相配的文件和目录.

  -y

  使用并列格式输出

  实例:

  假设我们有两个文件(file1 和 file2):

  代码如下:

  $ cat file1

  Hi,

  Hello,

  How are you?

  I am fine,

  Thank you.

  代码如下:

  $ cat file2

  Hello,

  Hi,

  How are you?

  I am fine.

  你可以看见两个文件有些小的不同。现在,让我们看看diff命令如何找出两者的不同的。

  像这样运行diff命令:

  代码如下:

  $ diff file1 file2

  1d0

  < Hi,

  2a2

  > Hi,

  4,5c4

  < I am fine,

  < Thank you.

  ---

  > I am fine.

  你可以看见diff后面跟了两个文件的名字作为命令行的参数,并且它在输出中生成了差异比较。输出并不容易理解。理由是,这是被计算机使用的而不是为了人类。尽管如此,让我们一步步解码输出:

  注意 – 在下面的文本中,file1和file2将被当作旧文件和新文件。

  代码如下:

  1d0

  < Hi,

  这里,1d0这一行意味着旧文件的第一行应该被删除(d)以使两个文件的第一行同步。旧文件中需要被删除的行以'<'标记。

  代码如下:

  2a2

  > Hi,

  这里,2a2行意味着新文件中的第二行应该加到旧文件的第二行后。要添加的行显示在输出的下一行用'>'标记。

  代码如下:

  4,5c4

  < I am fine,

  < Thank you.

  ---

  > I am fine.

  这里,4,5c4这一行意味着在旧文件中的4到5行现在已被改变并且需要用新文件中的第4行代替。添加和删除的行分别用'>'和'<'表示。

  那么,来总结一下,

  首先diff命令的第一个参数被视为旧文件而第二个参数被视为新文件。

  像1d0、2a2、4,5c4这种表达式可以用语法解码为 [旧文件的行号或者行的范围][行为][新文件的行号或者行的范围]。这里的'行为'可以是追加,删除或者改变替换。

  '<'代表删除的行,而'>'代表添加的行。

  除了文件外,diff命令还可以比较两个目录。让我们通过一个例子学习。

  这里是'new_dir'目录包含的内容:

  代码如下:

  $ ls new_dir/

  file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt

  file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt

  这是'orig_dir'目录含有的内容:(译注:原文为and here are the contents of a directory named ‘olddir’ ,其中'olddir'应为笔误。)

  代码如下:

  $ ls orig_dir/

  file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt test

  file2 frnd frnd1.cpp log1.txt log3.txt log5.txt

  下面是diff命令执行后的输出:

  代码如下:

  $ diff new_dir/ orig_dir/

  Only in new_dir/: file

  Only in orig_dir/: test

  你可以看到当diff命令被用来比较这两个目录时,很容易就会显示两个文件中缺失的文件。

  下面是一些在命令行下常用的选项:

  1. 用 -i 忽略大小写

  如果两个文件含有相同的文本但是大小写不同,diff命令仍会默认报告它不同。

  比如:

  代码如下:

  $ cat file1

  HI

  $ cat file2

  hi

  $ diff file1 file2

  1c1

  < HI

  ---

  > hi

  你可以看见diff命令在输出中报告了大小写不同。

  要去除这个默认行为,使用-i选项。

  以下是个例子:

  代码如下:

  $ diff -i file1 file2

  这样你可以看到没有生成输出,这是当两个文件相同时的默认行为。

  2. 用 -s 选项报告两个文件相同

  在例子1的后面,我们看到如果文件相同diff不会生成报告。虽然这个默认行为不错但是它仍可能会造成很大疑惑,特别对于新手而言。因此,如果你像样diff命令明确地报告两个文件不同,那么就使用-s命令选项。

  来举个例子:

  代码如下:

  $ diff -is file1 file2

  Files file1 and file2 are identical

  你可以看到我加了-s选项在后面的例子中,这次diff命令会明确地报告两个文件是相同的。

  3. 使用 -b 忽略空格

  另外一个常用的是diff报告文件存在不同数量的空格。

  举例说明:

  代码如下:

  $ cat file1

  Hi, how are you?

  $ cat file2

  Hi, how are you?

  观察这两个文件唯一的不同是file2中'are'和'you'之间额外的空格。现在,当使用diff命令比较两个文件时,输出如下:

  代码如下:

  $ diff file1 file2

  1c1

  < Hi, how are you?

  ---

  > Hi, how are you?

  因此你可以看到diff命令报告了不同。但是如果你想要忽略这些空格,使用 -b 选项。

  代码如下:

  $ diff -b file1 file2

  这样你可以看到由于-b选项,diff命令报告这两个文件是相同的。

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号
淳安分站 淳安分站