Shell 查找并修补文件差异

Shell 查找并修补文件差异,当文件存在多个版本时,如果能够重点标记出这些版本之间的不同而无须通过人工查看来比较,那就简直是太棒了。本章为你演示如何生成文件之间的差异对比。当多名开发人员共事时,某个人对于文件的修改必须告知其他人。要是发送整个源代码的话,可是一件耗时的活儿。这时,发送一个差异文件就显得很有用了,因为该文件中只包含那些被修改、添加或删除的行以及行号。这种差异文件叫作修补文件(patch file)。我们可以用patch命令将修补文件中包含的变更信息应用到原始文件,也可以再次进行修补来撤销变更。

Shell 查找并修补文件差异

实战演练

diff命令可以生成两个文件之间的差异对比。

(1) 先创建下列用于演示的文件。
文件 1:version1.txt

this is the original text
line2
line3
line4
happy hacking !

文件 2:version2.txt

this is the original text
line2
line4
happy hacking !
GNU is not UNIX

(2) 非一体化(nonunified)形式的diff输出(不使用-u选项)如下:

$ diff version1.txt version2.txt
3d2
<line3
6c5
> GNU is not UNIX

(3) 一体化形式的diff输出如下:

$ diff -u version1.txt version2.txt
--- version1.txt  2010-06-27 10:26:54.384884455 +0530
+++ version2.txt  2010-06-27 10:27:28.782140889 +0530
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
-
+GNU is not UNIX

选项-u用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件之间的差异,所以人们往往更喜欢这种输出形式。
在一体化diff输出中,以+起始的是新加入的行,以-起始的是被删除的行。

(4) 修补文件可以通过将diff的输出重定向到一个文件来生成:

$ diff -u version1.txt version2.txt > version.patch

现在就可以用patch命令将变更应用于其中任意一个文件。当应用于version1.txt时,就可以得到version2.txt;而当应用于version2.txt时,就得到了version1.txt。

(5) 用下列命令来进行修补:

$ patch -p1 version1.txt < version.patch
patching file version1.txt

version1.txt的内容现在和version 2.txt一模一样了。
(6) 下列命令可以撤销作出的变更:

$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected!  Assume -R? [n] y
# 变更被撤销

如上例所示,对已修补过的文件再修补将撤销作出的变更。如果使用patch命令的-R选项,则不会提示用户y/n

补充内容

让我们再看一些diff的其他特性。
生成目录的差异信息
diff命令也能够以递归的形式处理目录。它会对目录中的所有内容生成差异对比。使用下面的命令:

$ diff -Naur directory1 directory2

该命令中出现的选项含义如下。

  • -N:将缺失的文件视为空文件。
  • -a:将所有文件视为文本文件。
  • -u:生成一体化输出。
  • -r:递归遍历目录下的所有文件。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程