用了这么久linux,发现还有这么精妙的功能没有使用到,都不好意思跟人说我会linux了。
首先提供两个测试使用的简单文本文件
before.txt
This is a line to be deleted
This is a line that will be changed
This is a line that will be unchanged
after.txt
This is a line that has been changed
This is a line that will be unchanged
This is a line that has been added
diff before.txt after.txt
1,2c1
< This is a line to be deleted
< This is a line that will be changed
---
> This is a line that has been changed
3a3
> This is a line that has been added
说明:
1,2c1是指替换第1个文件的第1,2行到第2个文件的第2行,这里的1,2是指第1个文件的第1,2行,c是替换的意思,最后的1是第2个文件的第1行。
<号是指第1个文件更改或删除的行。
—号是分割两个文件。
>号是第2个文件中增加或删除的行。
3a3是指将第2个文件的第3行插入到第一个文件的第3行。也就是说第1个文件的:
< This is a line to be deleted
< This is a line that will be changed
被替换成第2个文件的:
> This is a line that has been changed
由于第1个文件的第3行和第2个文件的第2行一致,所以不做修改。
由于第2个文件的第3行是第1个文件所不具有的,所以在第1个文件的最后一行增加:
> This is a line that has been added
diff -u before.txt after.txt | tee mypatch.diff
--- before.txt 2009-06-20 05:21:49.000000000 +0800
+++ after.txt 2009-06-20 04:03:16.000000000 +0800
@@ -1,3 +1,3 @@
-This is a line to be deleted
-This is a line that will be changed
+This is a line that has been changed
This is a line that will be unchanged
+This is a line that has been added
说明:
diff -u选项是统一格式输出.
— before.txt 2009-06-20 05:21:49.000000000 +0800
— before.txt是指旧文件
+++ after.txt 2009-06-20 04:03:16.000000000 +0800
+++ after.txt是指新文件.
@@ -1,3 +1,3 @@
@@ -1,3是指第1个文件一共有3行,+1,3 @@是指第2个文件一共有3行.
-This is a line to be deleted
-This is a line that will be changed
是被删除的行
+This is a line that has been changed
是增加的行
This is a line that will be unchanged
没有-号和+号是指该行不变,因为after.txt和before.txt都有这行.
+This is a line that has been added
是增加的行
diff的统一格式比较与输出是按顺序进行的。
使用diff的传统格式输出补丁文件
diff before.txt after.txt > mypatch.txt
用patch修补before.txt文件,使before.txt和after.txt一致.
cat mypatch.txt | patch before.txt
patching file before.txt
比较两个文件,现在是一致的了
cmp before.txt after.txt
用patch命令恢复before.txtpatch -R before.txt < mypatch.txt
patching file before.txt
注:-R标记告诉patch在反向上应用区别或者撤销patch.
再比较两个文件,现在不一致了.
cmp before.txt after.txt
before.txt after.txt differ: byte 17, line 1
新建old和new目录,old目录包含了初始内容,new目录包含文件的最新版本
mkdir old new
echo "This is one. It's unchanged." | tee old/one new/one
echo "This is two. It will change." > old/two
echo "This is two. It changed."> new/two
echo "This is three. It's new" > new/three
创建修补文件
diff -Nur old/ new/ > mypatch.diff
注:-r选项按照文件目录递归创建修补文件;-u还是统一模式;-N是指当diff遇到一个只存在于两个树中的一个树中的文件时,默认情况下跳过文件并且打印一个警告到stderr。这个行为可以通过-N选项来更改,这也导致了diff认为丢失的文件实际上是存在的,但它是空的.采用这种方式,一个修补文件可以包括已经创建的文件.然后应用修补程序创建新的文件.
more mypatch.diff
# 输出:
diff -Nur old/three new/three
--- old/three 1970-01-01 08:00:00.000000000 +0800
+++ new/three 2009-06-20 06:55:34.000000000 +0800
@@ -0,0 +1 @@
+This is three. It's new
diff -Nur old/two new/two
--- old/two 2009-06-20 06:55:08.000000000 +0800
+++ new/two 2009-06-20 06:55:21.000000000 +0800
@@ -1 +1 @@
-This is two. It will change.
+This is two. It changed.
注释:
diff -Nur old/three new/three是指下面比较old/three new/three两个文件。因为没有old/three文件,所以在old/three中增加+This is three。 It’s new diff -Nur old/two new/two是指下面比较old/two new/two两个文件。因为old/two与new/two的第3行不一致,所以删除This is two. It will change.增加This is two. It changed.
打补丁到old目录,新建old/three以及更改old/two
patch --dir old < mypatch.diff
ls -l old/
# 输出:
one three two
恢复old目录的内容,包括删除old/three,以及恢复old/two文件patch --dir old -R < mypatch.diff
patch --dir old -R < mypatch.diff
# 输出:
ls -l old/
one two
用vim突出显示单个字符的更改来表示区别
vim -d after.txt before.txt
用gui工具gvimdiff来显示两个文件
gvimdiff after.txt before.txt
新建文件orig.c
void foo(void)
{
printf("This will be changed by me. \n");
printf("This will be unchanged,\n");
printf("This will be changed by you.\n");
}
复制文件orig.c到me.c,更改第4行为printf(”This was changed by me. \n”);
void foo(void)
{
printf("This was changed by me. \n");
printf("This will be unchanged,\n");
printf("This will be changed by you.\n");
}
复制文件orig.c到you.c,更改第7行为printf(”This was changed by you.\n”);
void foo(void)
{
printf("This will be changed by me. \n");
printf("This will be unchanged,\n");
printf("This was changed by you.\n");
}
版本工具如cvs,subversion使用GNU合并工具称为diff3
diff3 me.c orig.c you.c
#输出:
====1
1:3c
printf("This was changed by me. \n");
2:3c
3:3c
printf("This will be changed by me. \n");
====3
1:7c
2:7c
printf("This will be changed by you.\n");
3:7c
printf("This was changed by you.\n");
注:
在没有参数的情况下,diff3产生的输出说明了那行更改.
====1和====3指明造成同原始文件不同的是哪一个修改文件.
编号方式基于参数序列.
也就是第1个文件和第3个文件与原文件不同.
1:3c
printf("This was changed by me. \n");
3:3c
printf("This will be changed by me. \n");
1:3c表示第1个文件的第3行与3:3c表示的第3个文件的第3行不同.
为什么不显示与原文件的比较呢。因为第3个文件的第3行与源文件(第2个文件)相同.所以与哪个文件比较无所谓了.
2:7c
printf("This will be changed by you.\n");
3:7c
printf("This was changed by you.\n");
2:7c表示第2个文件的第7行与3:7c表示的第3个文件的第7行不同.
diff3会试图为我们进行合并.合并是在源文件的基础上,依据两个新文件进行修改。源文件是第二个文件,第一个文件和第三个文件可以互换,但他们必须有共同的祖先,就是第二个文件.
diff3 -m me.c orig.c you.c |cat -n
#输出:
1 void foo(void)
2 {
3 printf("This was changed by me. \n");
4
5 printf("This will be unchanged,\n");
6
7 printf("This was changed by you.\n");
8 }
参考来源:
http://gooss.org/linux-diff-and-patch-depth-analysis-of/
分享到:
相关推荐
关于Linux diff & patch的资料,想深入了解diff的童鞋可以收藏下
linux diff命令、patch制作
1) 在数学上来说:diff/patch,diff是对2个集合求差,patch是求和 ... diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch 升级 cp diff.patch linux-2.6.xxx/. cd linux-2.6.xxx patch -p1 < diff.p
详细解释了如何对linux打升级补丁 patch(diff)命令详解 制作 添加和 步骤实例
diff命令,在制作patch文件的时候,基本上只需要使用到diff -Nau 这个参数,如果比较的是文件夹,还要加上-r参数,所以一般直接使用Naur参数。 功能说明:修补文件。 语 法:patch [-bceEflnNRstTuvZ][-B <备份...
armboot-org2mini2440.diff:patch补丁包 补丁方法:将原始的armboot程序包armboot-1.1.0.tgz 解开后,将armboot-org2mini2440.diff文件放到和armboot-1.1.0的同级目录上,不要拷贝到 armboot-1.1.0 目录里面,...
1) 在数学上来说:diff/patch,diff是对2个集合求差,patch是求和 ... diff -uNr linux-2.6.xxx linux-2.6.xxx.1 > diff.patch 升级 cp diff.patch linux-2.6.xxx/. cd linux-2.6.xxx patch -p1 < diff.p
因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。本文首介绍一下diff和patch。然后介绍了制作Patch为单个文件和多个文件进行补丁操作的方法。
本讲是编程系列讲座的第一讲,主要讲述 Linux 平台上的 C 语言环境,包括编译器、 调试器、Make、Diff、Patch 等。其目的是通过介绍 Linux 上 C 语言编程的基本工具 以及一些新手必须掌握的技巧,迅速引导新手入门,...
用于解析和应用统一差异的库。... python patch-1.16.zip diff.patch 安装 patch.py是自给自足的。 您可以将其复制到您的存储库中,然后从此处使用它。 此设置将始终是可重复的。 但是,如果您需要添加pa
diff命令,在制作patch文件的时候,基本上只需要使用到diff -Nau 这个参数,如果比较的是文件夹,还要加上-r参数,所以一般直接使用Naur参数。 实验的基本步骤。我打算是建立一个级联目录./x/xx/xxx/,在xxx目录下...
Linux基本防护措施 使用sudo分配管理权限 提高SSH服务安全 SELinux安全防护 加密与解密应用 使用AIDE做入侵检测 扫描与抓包分析 案例1:部署audit监控文件 ...案例8:常用系统监控命令配置与使用Zabbix监控系统
用于Zip(Jar,Apk)文件Diff&Patch的C ++库和命令行工具; 创建最小增量/差异; 支持(Apk v1标志)& & 您可以使用此库(和Android NDK)来增量更新Apk。 (不支持zip64,仅支持解码代码;从属库 , 和 。) [] ...
主要讲述 Linux 平台上的 C 语言环境,包括编译器、 调试器、Make、Diff、Patch 等。其目的是通过介绍 Linux 上 C 语言编程的基本工具 以及一些新手必须掌握的技巧,迅速引导新手入门,以避免走弯路。
linux下有两个经常使用的命令patch
主要涉及shell脚本中文本处理常见命令,diff/patch查找文本差异,字符串截取cut、tr、uniq等
diff、diffstat、file、find、git、gitview、ln、locate、lsattr、mattrib、mc、mcopy、mdel、mdir、mktemp、mmove、mread、mren、mshowfat、mtools、mtoolstest、mv、od、paste、patch、rcp、rhmask、rm、slocate...
10. linux电子邮件与新闻组命令 173 archive 173 ctlinnd(control the internet news daemon) 173 elm 173 getlist 174 inncheck(inn check) 174 mail 175 mailconf 175 mailq(mail queue) 175 messages 176 ...