差异输出中的感叹号是什么意思?

Den*_*nco 7 diff

我有一个学校的任务。其中一部分是检查文件的更改并将这些更改写入日志文件。到目前为止,我已经找到了diff在我看来可能有帮助的命令。假设我有两个文件,内容如下:

文件 1

orange
apple
Run Code Online (Sandbox Code Playgroud)

文件 2

orange
apple
strawberry
Run Code Online (Sandbox Code Playgroud)

如果我diff -c file1 file2在这种情况下使用,命令的输出是

*** file1   2016-11-24 08:31:19.424712242 +0100
--- file2   2016-11-24 08:25:24.604681751 +0100
***************
*** 1,2 ****
--- 1,3 ----
  orange
  apple
+ strawberry
Run Code Online (Sandbox Code Playgroud)

我认为这意味着需要将带有“+”符号的行添加到 file1 中才能使它们相同(?)。

现在假设我将 file1 更改为:

orange
apple
peach
Run Code Online (Sandbox Code Playgroud)

的输出diff -c file1 file2是:

*** file1   2016-11-24 08:34:50.647128312 +0100
--- file2   2016-11-24 08:25:24.604681751 +0100
***************
*** 1,3 ****
  orange
  apple
! peach
--- 1,3 ----
  orange
  apple
! strawberry
Run Code Online (Sandbox Code Playgroud)

在这里我迷路了,因为我不明白这些感叹号是什么意思。突然之间,diff 命令似乎没那么有用了。我试过查看 diff 命令的手册页,但找不到任何东西(也许我只是没有看到)。

Mic*_*elt 10

  • diff -u

可能是你的任务所需要的。

以您为例并使用diff -u

michael@x071:[/home/michael]diff -u file?
--- file1       2016-11-24 07:48:41 +0000
+++ file2       2016-11-24 07:48:57 +0000
@@ -1,3 +1,3 @@
 orange
 apple
-peach
+strawberry
Run Code Online (Sandbox Code Playgroud)

一句忠告 - RTM - 或 - 阅读手册。通常还有其他选择。仅供参考:diff(和比较三个文件时的 diff3)的历史选项是帮助创建“程序输入输出”,将文件 1 更改为文件 2(或文件 2 回到文件 1)。这是所有“版本控制”软件的基础。

我很久以前记得的差异选项:

  • -e : 以适合与 ed 编辑器一起使用的形式生成输出,以将 File1 转换为 File2。
  • -f: 以不适合与 ed 编辑器一起使用的形式生成输出,以与在-e标志下生成的相反顺序显示将 File1 转换为 File2 所需的修改。
  • -n: 产生类似于-e标志的输出,但顺序相反,并在每个插入或删除命令上记录更改的行数。这是修订控制系统 (RCS) 使用的表格。

我要强调的最后一个选项是“新”选项——相对而言。(也有几年的历史,但通常不在 POSIX 实现中)。这不是创建适合于 'RCS' 的 'ed' 的输出,而是适用于patch

  • -u: 使用三行统一上下文生成 diff 命令比较。输出与-c标志类似,只是上下文行不重复;相反,上下文、删除的和添加的行一起显示,交错显示。

恕我直言:关键值diff -c是对命令的改进cmp- 当您想知道的不仅仅是两个文件是否不同时。我从来没有注意过(也许它也是一个“新”选项)-但是当我的问题是递归搜索两个目录树之间不同的文件时,应该考虑一下。


Tob*_*ght 7

您的问题在 diff 的信息文件 node 中得到了回答Detailed Context

不同行周围的上下文行以两个空格字符开头。两个文件之间不同的行以以下指示符之一开头,后跟空格字符:

  • !

    一行是在两个文件之间更改的一组或多行的一部分。!在另一个文件的这个大块部分中,有一组相应的标记为 。

  • +

    第二个文件中的“插入”行,对应于第一个文件中的任何内容。

  • -

    第一个文件中的“已删除”行与第二个文件中的任何内容都不对应。

Info 文件包含大量关于输出格式的信息,包括标题行。我建议你再读一遍。


Sat*_*ura 5

的输出diff由块组成,每个块对应一组更改。该***************行标记了这样一个块的开始。

每个块都为您提供文件中的上下文。 *** 1,3 ****表示接下来是第一个文件中的第 1 至 3 行,而--- 1,3 ----表示接下来是第二个文件中的第 1 至 3 行。

-第一列中的减号表示已删除的+行,加号表示已添加的行。感叹号!标记已更改的行。

如果您的情况,peach在第一个文件中已更改为strawberry在第二个文件中。