diff命令详解

diff命令详解

转自:http://www.flatws.cn/article/program/shell/2011-02-23/14053.html

一、文本文件比较命令diffdiff -Nuar linux-3.0 linux-3.0 > linux-3.0-s3c2440.patch

diff命令,在制作patch文件的时候,基本上只需要使用到diff -Nau 这个参数,如果比较的是文件夹,还要加上-r参数,所以一般直接使用Naur参数。

Example. ----diff和patch命令

第一:如果当前目录下有linux-3.0 源码目录文件和修改后的linux-3.0-s3c2440目录文件,如何生成patch文件?
>>>>diff -Nuar linux-3.0 linux-3.0 > linux-3.0-s3c2440.patch
就可以生成linux-3.0-s3c2440.patch文件。
 
第二:如果当前目录下有修改后的linux-3.0-s3c2440目录文件和linux-3.0-s3c2440.patch文件,如何生成源码linux-3.0源码目录文件呢?
>>>> patch -RE -p0 < linux-3.0-s3c2440.patch
>>>>mv linux-3.0-s3c2440  linux-3.0
就可以生成linux-3.0源码目录文件
 
第三:如果当前目录下有linux-3.0源码目录文件和linux-3.0-s3c2440.patch文件,如何生成修改后的linux-3.0-s3c2440目录文件呢?
>>>>patch -p0 < linux-3.0-s3c2440.patch
>>>>mv linux-3.0  linux-3.0-s3c2440
就可以生成linux-3.0-s3c2440目录文件


1>diff命令的功能
Linux中diff命令的功能为逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

2>语法
diff [options] file1 file2

该命令告诉用户,为了使两个文件file1和file2一致,需要修改它们的哪些行。如果用”-”表示file1或file2,则表示标准输入。如果file1或file2是目录,那么diff将使用该目录中的同名文件进行比较。

3>[options]主要参数

-a:将所有文件当作文本文件来处理。

-b或–ignore-space-change  忽略空格造成的不同。

-B或–ignore-blank-lines  忽略空行造成的不同。

-c:使用纲要输出格式。

-H:利用试探法加速对大文件的搜索。

-I:忽略大小写的变化。

-n –rcs:输出RCS格式。

-N或–new-file  在比较目录时,若文件A仅出现在某个目录中,会显示:Onlyin目录;文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。

-r或–recursive  比较子目录中的文件。

-u,-U<列数>或–unified=<列数>  以合并的方式来显示文件内容的不同。

4>使用方法的实例说明

例如: diff /usr/xu mine

把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。

通常输出由下述形式的行组成:

n1 a n3,n4

n1,n2 d n3

n1,n2 c n3,n4这些行类似ed命令把filel转换成file2。字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)是针对file2的。字母a、d和c分别表示附加、删除和修改操作。

在上述形式的每一行的后面跟随受到影响的若干行,以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。

diff能区别块和字符设备文件以及FIFO(管道文件),不会把它们与普通文件进行比较。

如果file1和file2都是目录,则diff会产生很多信息。

5>diff最常用的功能

diff有很多功能平时我们不常用到,最常用的功能莫过于生成patch文件了:

diff -urN old/ new/ > mysoft.patch
参数 -u 表示使用 unified 格式,-r 表示比较目录,-N表示将不存在的文件当作空文件处理,这样新添加的文件也会出现在patch文件中。

然后在需要应用patch的地方使用下述命令即可:

patch -p0 < mysoft.patch

diff的 -y 命令(长格式为–side-by-side)可以将屏幕分成左右两部分,来比较两个文件之间的差异。许多图形化的比较工具都有这个功能,但如果只能使用命令行,这个参数就相当有用了。如果要改变左右各部分的宽度,可以通过 -W (–width)参数来指定。
–ignore-blank-lines参数可以不检查空白行。这样DOS格式和Unix格式的文件互相比较时,就不至于因为换行符不一致而出现大量的差异。

二、二进制文件比较命令cmp

用途
比较两个文件的内容并报告不同的第一个字符。

语法
cmp [ -l | -s ] File1 File2

描述
cmp 命令比较 File1 和 File2 参数指定的文件,并将结果写到标准输出。如果为 File1 或 File2 参数指定-(减号),则 cmp 命令读取该文件的标准输入。只可以从标准输入读取一个文件。在缺省条件下,如果文件相同,则 cmp命令不显示任何内容。如果它们不同,则 cmp 命令显示发生不同的第一个字节数和行数。如果指定了 -l标志,并且如果一个文件是另一文件的初始后继(即,如果在查找任何差别之前,cmp 命令读取文件中的文件结束符),则 cmp命令记下它。通常,使用 cmp 命令比较非文本文件,使用 diff 命令比较文本文件。
标志
-l    对于每个不同,(小写字母 L)显示十进制的字节数和八进制的不同字节。
-s    只返回退出值。值 0 指示相同的文件;值 1 指示不同的文件;值 2 指示不可访问的文件或缺少选项。
退出状态
该命令返回以下退出值:
0    文件相同。
1    文件不同。即使一个文件是另一个文件的初始后继(一个文件与另一个文件的第一个部分相同),也给出该值。
>1    发生错误。
示例
   1. 要确定两个文件是否相同,请输入:
     cmp prog.o.bak prog.o
     这比较 prog.o.bak 和prog.o。如果文件相同,则不显示消息。如果文件不同,则显示第一个不同的位置;例如:
     prog.o.bak prog.o differ: char 4, line 1
     如果显示消息 cmp: EOF on prog.o.bak,则 prog.o 的第一部分与 prog.o.bak 相同,但在prog.o 中还有其他数据。
   2. 要显示不同字节的每个对,请输入:
cmp -l prog.o.bak prog.o
这比较文件,然后显示字节数(使用十进制格式)和每个不同的不同字节(使用八进制格式)。例如,如果第五个字节在 prog.o.bak中是八进制 101,在 prog.o 中是 141,则 cmp 命令显示:
     5 101 141
   3.要比较两个文件,而不写任何消息,请输入:
     cmp -s prog.c.bak prog.c
这样,如果文件相同,则给出值 0,如果不同,则给出值 1,或者如果发生错误,则给出值 2。该命令形式通常用在 shell步骤中。例如:
     if cmp -s prog.c.bak prog.c
then
echo No change
fi
如果两个文件相同,则该部分的 shell 步骤显示 No change。

[]

三、patch命令

【描述】

        patch 命令读取如何更改文件的源文件指示信息,然后应用这些更改。源文件包含由 diff 命令产生的差别列表(或者 diff 列表)。差异列表是比较两个文件和构建关于如何纠正差别的指示信息的结果。缺省情况下,patch 命令使用从标准输入读入的源文件,但是使用 -i 标志和 PatchFile 变量可以覆盖此设置。

   差异列表有三种格式:正常、上下文或者是 ed 编辑器风格。patch 命令确定差异列表格式,除非被 -c、-e 或 -n 标志否决。

  缺省情况下,文件的打过补丁的版本替换原始版本。指定 -b 标志时,每个补丁文件的原文件保存在同名的文件中,只是在文件名后附加了后缀 .orig。使用 -o 标志也可以指定输出的目的地。

常用项:

patch 命令使用patch 命令用于打补丁,补丁文件是使用diff产生的

patch 命令语法patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ -p Number ] [ -r RejectFile ] [ -x Number ] [ File ]

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

-p0 选项从当前目录查找目的文件(夹)(直接使用补丁文件里面指定的路径)

-p1 选项忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第1个'/'及前面所有内容)。

-E  选项说明如果发现了空文件,那么就删除它

-R  选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

 

patch 命令失败或拒绝接受补丁时,会产生一个和原文件同名,以".rej"为后缀的差异文件。 

  当知道 -b 时,会产生一个和原文件同名,以".orig"为后缀的备份文件。

常使用的 patch 参数:

-p 指定目录级别(从路径全称中除去几层目录)

如,如果补丁文件包含路径名称 /curds/whey/src/blurfl/blurfl.c,

那么: -p 0 使用完整路径名

-p 1 除去前导斜杠,留下 curds/whey/src/blurfl/blurfl.c。

-p 4 除去前导斜杠和前三个目录,留下 blurfl/blurfl.c。

-d Directory 打补丁前,更改当前目录到指定目录

-i PatchFile 从指定文件,而不是从标准输入中读取补丁信息

-R 逆向补丁,这个选项在防止打错补丁很有用处

补丁的产生一般用diff -Nrua a b > c.patch

如:#diff -Nrua linux-2.6.14/Makefile linux-2.6.26/Makefile >c.patch

#cat c.patch

--- linux-2.6.14/Makefile 2008-07-30 16:54:20.000000000 +0800

+++ linux-2.6.26/Makefile 2008-07-14 05:51:29.000000000 +0800

@@ -1,8 +1,8 @@

VERSION = 2

PATCHLEVEL = 6

-SUBLEVEL = 14

+SUBLEVEL = 26

EXTRAVERSION =

-NAME=Affluent Albatross

+NAME = Rotary Wombat

# *DOCUMENTATION*

# To see a list of typical targets execute "make help"

--- 的文件表示将被打补丁的文件 

如:linux-2.6.14/Makefile

+++ 的文件表示补丁来源文件  

如:linux-2.6.26/Makefile应用

patch #ls c.patch linux-2.6.14 linux-2.6.26

#cd linux-2.6.14

#patch -p1 <../c.patch 

 如果有多个补丁要打,则应该注意打补丁的顺序!


你可能感兴趣的:(linux系统学习)