我有一份学校作业。其中一部分是检查文件是否有更改并将这些更改写入日志文件。到目前为止,我已经找到了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
第二个文件。