免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 865 | 回复: 0
打印 上一主题 下一主题

diff && patch [复制链接]

论坛徽章:
17
2015年辞旧岁徽章
日期:2015-03-03 16:54:152017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:19:56JAVA
日期:2016-11-01 13:25:46C
日期:2016-10-25 16:01:4715-16赛季CBA联赛之八一
日期:2016-06-21 23:38:0815-16赛季CBA联赛之山东
日期:2016-05-12 12:49:54IT运维版块每日发帖之星
日期:2016-04-20 06:20:00IT运维版块每日发帖之星
日期:2016-03-22 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-08-25 06:20:002015亚冠之德黑兰石油
日期:2015-08-22 22:55:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-21 15:02 |只看该作者 |倒序浏览

diff
diff [命令行选项] 原始文件 新文件  [> patch文件]
下面介绍三个最为常用选项:
-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。
-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。
-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。
-a patch里可以包含二进制文件
由 -e 或 -f 标志产生的编辑脚本无法创建由单个组成的行。(周期)。
-f 以不适合 ed 编辑器的格式创建输出,按照在 -e 标志下产生的逆向顺序显示从 File1 到 File2 的转换的必要修改。
-h 如果要更改的部分比较短而且分隔清晰,则执行备用的比较可能会更快。-h 标志可用于任意长度的文件。
-c、-C、-D、-e、-f 和 -n 标志无法与 -h 标志一起使用。当使用 -h 标志时,除了 -b 标志,其他标志一律忽略。
-i 忽略字母大小写。例如,小写 a 被认为同大写 A 一样。
-l 长输出格式。每个由文本文件比较 diff 命令获得的结果通过命令 pr 输送分页。在报告所有文本文件不同之处后,其他不同之处将被记忆
和总结。
-n 产生类似于 -e 标志创建的输出,但是顺序相反,而且在每一插入或删除命令上进行更改计数。这是修订控件系统(RCS)所用的格式。
-r 使 diff 命令的应用程序递归到遇到的公共子目录。
-s 报告相同的文件,否则不提。
-S [ File ] 当比较目录时,忽略在 File 变量指定的文件之前整理名称的文件。
-S 标志只用于 Directory1 和 Directory2 参数指定的目录。如果您将 -r 标志与 -S 标志一起使用, -S 标志在 Directory1 和 Directory2 子目录中不进行递归。
-t 在输出行扩展制表符。典型输出或者 -c 标志输出会添加字符到每一行首,这会影响初始行的缩进,使得输出列表难以解释。该标志则保留原始源的缩进。
-w 忽略所有空格和制表符,将所有其他空白字符串视为一致。例如,if ( a == b ) 与 if(a==b) 相等。
  
它的输出在stdout上,所以你可能需要把它重定向到一个文件。diff的输出有“传统格式”和“统一格式”之分,现在大都使用统一格式:
  传统格式示例:
   [hahalee@builder]$ diff a.txt b.txt
   1a2
   > here we insert a new line   (大于符号)开始的第二个文件中的所有受影响行
  统一格式示例:
   [hahalee@builder]$ diff -u a.txt b.txt
   --- a.txt Thu Apr 6 15:58:34 2000
   +++ b.txt Thu Apr 6 15:57:53 2000
   @@ -1,3 +1,3 @@
   This is line one
   +here we insert a new line
   and this is line two
   -why not this third line?
   通过比较可以看出,传统格式的patch文件比较小,除了要删除/插入的行外没有冗余信息。统一格式则保存了上下文(缺省是上下各三行,最少需要两 行),这样,patch的时候可以允许行号不精确匹配的情况出现。另外,在patch文件的开头明确地用---和+++标示出原始文件和当前文件,也方便 阅读。要选用统一格式,用 u 开关。
退出值 0 表示没有不同,1 表示找到不同处,2 表示出错。
通常,我们需要对整个软件包做修改,并生成一个patch文件,下面是典型的操作过程。这里就要用到前面介绍的几个命令行开关了:
  tar xzvf software.tar.gz # 展开原始软件包,其目录为software
  cp _a software software-orig # 做个修改前的备份
  cd software
  [修改,测试……]
  cd ..
  diff _ruNa software-orig software > software-my.patch
   现在我们就可以保存software-my.patch做为这次修改的结果,至于原始软件包,可以不必保存。等到下次需要再修改的时候,可以用patch命令把这个补丁打进原始包,再继续工作。比如是在linux kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是好处之一,好处之二是维护方便,由于unified patch格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量(见后)
如下
$ cat file1
123
456
789
$ cat file2
789
456
123
$
diff两个文件:
$ diff file1 file2
1,2d0
; 456
>; 123
这个结果所表示的意思不是你认为的那样,而是
1,2d0表示删除原file1的1,2行
3a2,3表示在原file1的第3行后插入file2的2,3行
执行完以上两部后,file1就等同于file2
其实我们对命令diff的理解缺乏深度,diff的实际是为了使得file1转变成file2,而为了达到转换则必须先进行比较,得出的那些结果只不过是diff的副产品。


#####################################################################

patch
patch [options] [originalfile] [
-pn patch level(n是数字) -b[后缀] 生成备份,缺省是.orig
   
下面介绍几个最常用选项:
-p0 选项要从当前目录查找目的文件(夹)
-p1 选项要忽略掉第一层目录,从当前目录开始查找。
patch程序默认从stdin读入,所以用了输入重定向。
参  数:
-b或--backup  备份每一个原始文件。   
-B或--prefix=  设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
-c或--context  把修补数据解译成关联性的差异。
-d或--directory=  设置工作目录。
-D或--ifdef=  用指定的符号把改变的地方标示出来。
-e或--ed  把修补数据解译成ed指令可用的叙述文件。
-E或--remove-empty-files  若修补过後输出的文件其内容是一片空白,则移除该文件。
-f或--force  此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新 版本。
-F或--fuzz  设置监别列数的最大值。
-g或--get=  设置以RSC或SCCS控制修补作业。
-i或--input=  读取指定的修补问家你。
-l或--ignore-whitespace  忽略修补数据与输入数据的跳格,空格字符。
-n或--normal  把修补数据解译成一般性的差异。
-N或--forward  忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使用过。
-o或--output=  设置输出文件的名称,修补过的文件会以该名称存放。
-p或--strip=  设置欲剥离几层路径名称。
-f或--reject-file=  设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
-R或--reverse  假设修补数据是由新旧文件交换位置而产生。
-s或--quiet或--silent  不显示指令执行过程,除非发生错误。
-t或--batch  自动略过错误,不询问任何问题。
-T或--set-time  此参数的效果和指定"-Z"参数类似,但以本地时间为主。
-u或--unified  把修补数据解译成一致化的差异。
-v或--version  显示版本信息。
-V或--version-control=  用"-b"参数备份目标文件後,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串。
-Y或--basename-prefix=--  设置文件备份时,附加在文件基本名称开头的字首字符串。
-z或--suffix=  此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串後,文件super.c会备份于/src/linux/fs/backup目录里。
-Z或--set-utc  把修补过的文件更改,存取时间设为UTC。
--backup-if-mismatch  在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
--binary  以二进制模式读写数据,而不通过标准输出设备。
--help  在线帮助。
--nobackup-if-mismatch  在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
--verbose  详细显示指令的执行过程。
-p 后面是要跟一个数字作为参数的, 表示忽略patch里面的多少层目录
patch里面记录的是文件之间的的差异, 例如:
Index: linux/Documentation/Configure.help
diff -u linux/Documentation/Configure.help:1.1.1.2 linux/Documentation/Configure.help:1.1.2.1.2.1
--- linux/Documentation/Configure.help:1.1.1.2  Mon Jan 10 21:35:32 2000
+++ linux/Documentation/Configure.help  Wed Jan 12 21:56:04 2000
@@ -7133,6 +7133,71 @@
   called minix.o. Note that the filesystem of your root partition (the
   one containing the directory /) cannot be compiled as a module.
  
如果用-p 1, 就表示patch的是./Documentation/Configure.help
用-p 2, 就表示patch./Configure.help
  关于二进制文件的说明:binary文件可以原始方式存入patch文件。diff可以生成(加-a选项),patch也可以识别。如果觉得这样的patch文
件太难看,解决方法之一是用uuencode处理该binary文件。

生成差异信息(或文件)一般用来制作补丁或比较多个文件的二异性
############################################################################

配合使用diff和patch升级源码
在此仅举一个简单的例子来说明如何用diff/patch工具维护源码升级。
假设program-1.0目录中为老版,现开发完成的新版位于program-2.0目录中,将两个目录置于同一父目录下,然后在该父目录上执行:
diff -Nur program-1.0 program-2.0 >program-2.0.patch

将生成一个program-2.0.patch的补丁文件,发布该补丁文件(当然可以先压缩成bzip2格式)。
假设拿到的是program-2.0.patch.bz2文件,则在program-1.0目录同级执行:
bzcat program-2.0.patch.bz2 | patch -p0

如此即完成了从1.0到2.0的升级。
如果希望恢复到原版本,可以使用-R(--reverse)参数,但仅对上下文格式的diff文件有效。还有一个备份参数也可以使用,但简单应用中,整个目录备份可能更方便一些。

两个文件的对比
文件1:/tmp/file1.txt
文件2:/tmp/file2.txt
用法:diff -ruN /tmp/file1.txt /tmp/file2.txt > /tmp/file.diff
则生成了一个 file2 相对 file1 的差异文件,这也是一个补丁
今後的补丁方法:cd /tmp; patch -p1
两个目录的对比
文件1:/tmp/path1
文件2:/tmp/path2
用法:diff -ruN /tmp/path1 /tmp/path2 > /tmp/path.diff


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28814/showart_325797.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP