栏目分类
系统管理 | 安装启动 | xwindow | 基础知识 | 存储备份 | 内核技术 | 桌面应用 | 设备驱动 | Linux汉化 | 系统管理 | PAM认证 | drivers | rpm | quota | 灾难恢复
Linux数据库 | oracle | 数据库理论 | MYSQL | PostGreSQL
网络管理 | nis技术 | ntp | 多媒体 | dhcp | 网络基础 | ldap | 美化汉化 | proxy | samba | bind | iptables | 集群 | nfs | cvs | ftp服务 | email | 网络配置 | 网络安全 | apache | vpn | ssh | 网络管理 | Linux服务器 | Linux安全 | subversion | 网络监控
编辑工具 | emacs | vi | eclipse
linux新手入门 | 指令大全 | 输入法类 | Linux安装 | 常用命令 | 软件使用
发行版 | 其它Unix | bsd | Gentoo/lFS | windows | solaris | IBM | debian
其他 | 非技术类 | 业界动态 | 小说笑话 | 杂项工具 | 速度优化 | Linux认证 | 资讯动态 | 办公自动化 | xml | vc | 学习方法 | 手机技巧
Linux编程 | shell | perl | python | 编程技术 | kernel | CC++编程 | Python编程 | Perl编程 | PHP编程 | discuz | java/jsp | zope | html技术
排行榜
·tar命令
·find用法
·查看当前linux的内核版本
·scp
·useradd
·使用yum代替up2date自动更新升级RedHatAS3
·必学的Linux指令
·du和df
·Linux指令大全(1)
·find实例
·修改系统时间
·linux指令大全
·Linux关机命令详解
·xhost
·find命令的exec选项用法详解
·Linux指令篇:档案目录管理--ln
·ls参数妙用
·Linux指令篇:使用者管理--sudo
·Linux必学60个命令文件处理
·文件管理命令详解

    您现在的位置: Linux宝库 >> Linux >> linux新手入门 >> 指令大全 >> 文章正文
使用diff同patch工具
Linux宝库 收集整理  作者:Linux宝库  时间:2008-05-09  收藏本站
来自:http://doc.linuxpk.com/81157.html
联系:linuxmine#gmail.com
分类:[指令大全]

 在给客户提供技术支持工作的时候,常会遇到需要修改各种不同的配置文件。过去的方式,通常是描述修改的地方,然后由用户自行修改,或使用sed等工具写 一个脚本给用户运行。但这样会带来一些问题:如果用户不会vi,或者他理解错、找错配置的位置,这样带来的问题可能更难预计。
   此时,或许可以试试我的方法,借用diff和patch直接帮用户修改,然后把生成的“patch补丁”发给他运行即可。这样工作量小,而且也能控制修改后的结果,当然也方便Email发送咯。
一、介绍
diff 和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。diff比较两个文件或文件集合的差异,并记录 下来,生成一个差异文件,这也是我们常说的补丁文件。补丁文件能运用于原来的两个集合之一,从而得到另一个集合。
举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。
二、使用
实例说明是最快的方法,假设现在有a、b两个文件,内容如下:

引用
$ cat a
123456
$ cat b
abcdef

其中a是用户发给我的文件,而b是我修改后的文件。


那我们可以这样生成c文件:


$ diff -Naur a b > c

然后,可以把c文件发给用户,运行如下的命令即可自行修改a->b:


$ patch -p0 a < c
patching file a

结果如下:


$ cat a
abcdef

三、恢复

上面的操作很简单吧。那如果万一a修改有误,如何恢复呢?通过前面的说明可以知道,通过c文件是可以直接恢复的:


引用
$ patch -R -p0 a < c
patching file a
$ cat a
123456

可以看到使用diff和patch是比较安全的,请注意-R选项哦!


另外,diff生成的c文件是有记录文件名的,在不指定原文件的情况下,可以自动识别:


$ patch -p0 < c
patching file a

反了会这样:


$ patch -p0 b < c
patching file b
Reversed (or previously applied) patch detected!  Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
1 out of 1 hunk ignored -- saving rejects to file b.rej

所以,一般是不会搞错新旧文件的。


四、路径问题

很多时候,我们还会遇到一个问题。就是为了防止文件修改错,或需要同时修改多个文件,可能会建立多一层目录,例如:


引用
$ ls -R
.:
new  old
./new:
b
./old:
a

diff是可以识别路径:


$ diff -Naur old/ new/ > c

补丁需要这样打:



$ cd old/
$ patch -p1 < ../c
patching file a
patching file b

结果如下:


引用
$ ls
b
$ cat b
abcdef

※注意咯,这样会把整个目录的文件内容和文件名都改掉的。另外,如果目录中有多个文件,除了new目录中的空文件外,会把old下的所有文件都换成new的文件和内容;new没有,而old有的文件,会删除。
引用
-pN参数的意思是:取消N层目录,也就是把old/改为./

五、注意事项


引用
1、在patch之前不要对原文件进行任何修改,否则补丁可能会失效;
2、如果做了多个补丁,请注意先后顺序,要按次序打才行;
3、如果打补丁出现问题,会生成.rej文件,其中包括原文件和补丁差异的地方。
本文来自:http://doc.linuxpk.com/81157.html
发表您的高见!

·上一篇:
Linux系统下查看OS系统块的大小
 
     最新更新
·使用diff同patch工具
·Linux系统下查看OS系统块的大小
·修改Linux操作系统的文件属性
·Linux系统下一些简单实用命令
·Linux系统终端scp命令的用法
· rsh命令的基本用法
·恢复Debian下root用户bash高亮显示
· UNIX常用命令
· Unix下打包命令的使用
·PS命令详解
·linux时钟设置
·linux下设置字符界面的分辨率
·用tar命令打包一个时间点之后的文件
·Useradd和Adduser添加用户工具使用方法
·Linux指令篇:日期时间排程--uptime
·Linux指令篇:日期时间排程--time
·Linux指令篇:日期时间排程--sleep
·Linux指令篇:日期时间排程--date
·Linux指令篇:日期时间排程--crontab
·Linux指令篇:日期时间排程--cal
·Linux指令篇:日期时间排程--at
·Linux指令篇:档案目录管理--touch
·Linux指令篇:档案目录管理--split
·Linux指令篇:档案目录管理--more
·Linux指令篇:档案目录管理--rmdir
·Linux指令篇:档案目录管理--rm
·Linux指令篇:档案目录管理--mv
·Linux指令篇:档案目录管理--mkdir
·Linux指令篇:使用者资讯与管理--chfn
·Linux指令篇:使用者资讯与管理--chsh