我有一个学校的任务。其中一部分是检查文件的更改并将这些更改写入日志文件。到目前为止,我已经找到了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
- 当您想知道的不仅仅是两个文件是否不同时。我从来没有注意过(也许它也是一个“新”选项)-但是当我的问题是递归搜索两个目录树之间不同的文件时,应该考虑一下。
您的问题在 diff 的信息文件 node 中得到了回答Detailed Context
:
不同行周围的上下文行以两个空格字符开头。两个文件之间不同的行以以下指示符之一开头,后跟空格字符:
!
一行是在两个文件之间更改的一组或多行的一部分。
!
在另一个文件的这个大块部分中,有一组相应的标记为 。
+
第二个文件中的“插入”行,对应于第一个文件中的任何内容。
-
第一个文件中的“已删除”行与第二个文件中的任何内容都不对应。
Info 文件包含大量关于输出格式的信息,包括标题行。我建议你再读一遍。
的输出diff
由块组成,每个块对应一组更改。该***************
行标记了这样一个块的开始。
每个块都为您提供文件中的上下文。 *** 1,3 ****
表示接下来是第一个文件中的第 1 至 3 行,而--- 1,3 ----
表示接下来是第二个文件中的第 1 至 3 行。
-
第一列中的减号表示已删除的+
行,加号表示已添加的行。感叹号!
标记已更改的行。
如果您的情况,peach
在第一个文件中已更改为strawberry
在第二个文件中。