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

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

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

文件1

orange
apple

文件2

orange
apple
strawberry

如果我在这种情况下使用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

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

现在假设我将 file1 更改为:

orange
apple
peach

的输出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

我在这里迷失了,因为我不明白这些感叹号的含义。突然间,diff 命令似乎没那么有用了。我尝试查看 diff 命令的手册页,但找不到任何内容(也许我只是没有看到它)。

答案1

  • 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

一条建议 - RTM - 或 - 阅读手册。通常还有其他选择。仅供参考:diff(以及比较三个文件时的 diff3)的历史选项是帮助创建“program inout”,将 file1 更改为 file2(或将 file2 更改回 file1)。这是所有“版本控制”软件的基础。

我很久以前记得的 diff 选项:

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

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

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

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

答案2

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

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

  • !

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

  • +

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

  • -

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

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

答案3

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

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

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

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

相关内容