您的位置:首页 > 职场人生

patch和diff命令

2010-08-05 16:46 204 查看
看到编译内核时要用到patch命令打补丁。其中patch -p参数一直都不太理解。于是跑到QQ 群里请教达人后,又实验了半天,总算是有点点明白了。现记录如下,以便日后使用。
说到patch命令,就不得不提到diff命令,也就是制作patch的必要工具。diff命令我不是很熟悉。但用起来很简单,在制作patch文件的时候,基本上只需要使用到diff -Nu 这个参数,如果比较的是文件夹,还要加上-r参数,现在只是实验最简单的patch文件,就不用那么复杂了。
先说下实验的基本步骤。我打算是建立一个级联目录./x/xx/xxx/,在xxx目录下建立两个不同的文件xxx1,xxx2。然后在xxx目录下用 diff命令,建立一个补丁文件xxx.patch ,在xx目录下建立一个补丁文件xx.patch,在x目录下建立一个补丁文件x.patch。然后在这三个目录下实验。
好了,下面就开始实验了。
首先是进入自己的家目录。
[King@Fedora ~]$ cd
[King@Fedora ~]$
然后建立实验目录。
[King@Fedora ~]$ mkdir -p x/xx/xxx
[King@Fedora ~]$ rm -rf x
[King@Fedora ~]$ mkdir -pv x/xx/xxx
mkdir: 已创建目录 “x”
mkdir: 已创建目录 “x/xx”
mkdir: 已创建目录 “x/xx/xxx”
[King@Fedora ~]$
进入xxx目录下创建xxx1,xxx2
[King@Fedora ~]$ cd x/xx/xxx
[King@Fedora xxx]$ cat >> xxx1 << EOF
> 111111
> 111111
> EOF
[King@Fedora xxx]$ cat >> xxx2 << EOF
> 111111
> 222222
> EOF
[King@Fedora xxx]$
查看这两个文件
[King@Fedora xxx]$ diff -y xxx1 xxx2
111111 111111
111111 | 222222
[King@Fedora xxx]$
在xxx目录下创建补丁文件xxx.patch,并查看。
[King@Fedora xxx]$ ls
xxx1 xxx2
[King@Fedora xxx]$ diff -Nu xxx1 xxx2 > xxx.patch
[King@Fedora xxx]$ cat xxx.patch
--- xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xxx2 2009-12-19 22:28:42.798928591 +0800
@@ -1,2 +1,2 @@
111111
-111111
+222222
[King@Fedora xxx]$
在xx目录下创建补丁文件xx.patch,并查看
[King@Fedora xxx]$ cd ..
[King@Fedora xx]$ diff -Nu xxx/xxx1 xxx/xxx2 > xx.patch
[King@Fedora xx]$ cat xx.patch
--- xxx/xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xxx/xxx2 2009-12-19 22:28:42.798928591 +0800
@@ -1,2 +1,2 @@
111111
-111111
+222222
[King@Fedora xx]$
在x目录下创建补丁文件x.patch,并查看
[King@Fedora xx]$ cd ..
[King@Fedora x]$ diff -Nu xx/xxx/xxx1 xx/xxx/xxx2 > x.patch
[King@Fedora x]$ cat x.patch
--- xx/xxx/xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xx/xxx/xxx2 2009-12-19 22:28:42.798928591 +0800
@@ -1,2 +1,2 @@
111111
-111111
+222222
[King@Fedora x]$

现将patch文件都拷贝到xxx目录下去。
[King@Fedora x]$ cp x.patch xx/xxx/
[King@Fedora x]$ cp xx/xx.patch xx/xxx/
[King@Fedora x]$
进入xxx目录开始实验
[King@Fedora x]$ cd xx/xxx
[King@Fedora xxx]$
[King@Fedora xxx]$ ls
x.patch xx.patch xxx1 xxx2 xxx.patch
[King@Fedora xxx]$ patch -p0 < xxx.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
222222
[King@Fedora xxx]$ patch -RE < xxx.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
111111

[King@Fedora xxx]$ patch -p1 < xx.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
222222
[King@Fedora xxx]$ patch -RE < xxx.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
111111

[King@Fedora xxx]$ patch -p2 < x.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
222222
[King@Fedora xxx]$ patch -RE < x.patch
patching file xxx1
[King@Fedora xxx]$ cat xxx1
111111
111111
[King@Fedora xxx]$

结论证明: patch -p参数后面所带的数字,就是patch文件在开始,所剥离的目录数。比如
xxx.patch的开头是
--- xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xxx2 2009-12-19 22:28:42.798928591 +0800
前面已经没有目录了,所以应该是patch -p0
xx.patch的开头是
--- xxx/xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xxx/xxx2 2009-12-19 22:28:42.798928591 +0800
前面有一层目录,需要剥离一层目录,所以应该是patch -p1
x.patch的开头是
--- xx/xxx/xxx1 2009-12-19 22:28:26.582959182 +0800
+++ xx/xxx/xxx2 2009-12-19 22:28:42.798928591 +0800
前面有两层目录,需要剥离两层目录,所以应该是patch -p2

有兴趣的朋友,可以试试把所有patch文件拷贝到x目录或者是xx目录下进行实验,结果是一样的。当然patch -p后面是不能带负数的。呵呵……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  命令 职场 休闲