Linux下patch和diff的用法介绍

      在Linux内核中,经常通过patch补丁来进行内核代码的下载。这里简介一下patch补丁的生成和使用,即diff命令和patch命令的使用。

    1.7Z的使用  

      在打补丁前,应为一般SDK包都是经过压缩来传输的,这里先简单介绍一下对压缩格式为7z的相关命令:

(1)、7z安装

     如果Ubuntu中没有安装7z软件,则可通过下列命令进行安装:

     sudo apt-get install p7zip p7zip-full p7zip-rar

(2)、7z解压

      一般而言推荐选用 7z x <压缩文件>.7z来解压,因为其是将压缩文件解压到压缩包命名的目录下,即解压到当前文件夹。

此外,还有7z e *.7z,其为将文件解压到当前路径。

ps:7z a <工程文件名>.7z <工程文件名>为压缩命令,将文件夹压缩为7z文件来便于传输。

      2.diff的使用

      diff  [option]  <old_file>  <new_file>  > ***.patch

     (1)[option]选项介绍:

        -a  Treat  all  files  as text and compare them line-by-line, even if they do not seem to be text.
         -N,--new-file
            In  directory  comparison, if a file is found in
            only one directory, treat it as present but empty
            in the other directory.

        -r  When comparing directories, recursively compare any subdirectories found.

         -u  Use the unified output format.

      一般而言,如果文件夹中只有代码文件,则option选项可以选为-Nur,但如果代码文件夹里面还有媒体文件之类,则最好选择-Nura,这样在使用patch命令打补丁的时候便可生成对应的媒体文件。

     当然,-Nur-Nura生成的patch文件的最大区别是-Nura生成的文件比较大。此外,这一介绍一些别的option选项:

-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;

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

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

-r或——recursive:比较子目录中的文件;

-a或——text:diff预设只会逐行比较文本文件;

-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或——paginate:将结果交由pr程序来分页;
-n或——rcs:将比较结果以RCS的格式来显示;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-v或——version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--help:显示帮助;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。

         3.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 ]


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

常使用的 patch 参数:

-p 指定目录级别(从路径全称中除去几层目录),如果补丁文件包含路径名称 /1/2/3/4/5.c ,那么:

  -p 0 使用完整路径名   -p 1 除去前导斜杠,留下 1/2/3/4/5.c。   -p 4 除去前导斜杠和前三个目录,留下 4/5.c。

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

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

-R 逆向补丁,可用来在打错补丁后进行文件的恢复


3.注意

      一般而言,补丁可能不止一个版本,所以在打补丁的时候,需要注意该补丁之前几个版本的,因为可能补丁需要一级一级地打,也可能可以直接打,这需要看补丁提供者的说明了。

     一般而言,打补丁的文件文件是未经修改过的,否则会出错。

4.举例

(1)-- 制作补丁

        命令:diff -urNa linux-3.4.2 linux-3.4.2-my  > linux-3.4.2.patch
        说明:
            当前路径为:./ 。

            该路径(./ )下有 linux-3.4.2 目录,其是linux-3.4.2的源码压缩包解压所得(linux-3.4.2源码未做任何修改的)。

            该路径(./ )下有 linux-3.4.2-my 目录,其是由linux-3.4.2的源码修改后,符合开发板正常使用的源码(根据linux-3.4.2源码修改后的)。

            生成 linux-3.4.2.patch 补丁文件。

(2)-- 打补丁


        命令:patch -p1 < ../linux-3.4.2.patch
        说明:

            当前路径为:./linux-3.4.2,进入到未做任何修改的linux-3.4.2的目录下执行patch命令



猜你喜欢

转载自blog.csdn.net/qwe15954250805/article/details/79057821