diff 和 patch 命令(打补丁)

diff 和 patch 命令(打补丁)

命令详解

diff 命令

diff 就是用在比对两个文件之间的差异的,并且是以行为单位来比对的!一般是用在 ASCII 纯文本文件的比对上。

由于是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)的新旧版本差异上!”

命令格式

diff [OPTION] from-file to-file > batch-file

from-file :一个文件名(或文件夹),作为原始比对文件的文件名;

to-file :一个文件名(或文件夹),作为目的比对文件的文件名;

batch-file :补丁(差异)文件,可选的。

注意,from-file 或 to-file 可以 - 取代,这个 - 代表“Standard input”之意

选项说明

-a, --text:所有的文件都视为文本文件来逐行比较

-B, --ignore-blank-lines:忽略插入删除空行引起的变化

-b, --ignore-space-change:忽略因空白符数量不同造成的差异

-C NUM

-c, --context[=NUM]:使用上下文格式输出,显示异行处上下指定数量的行(默认为 3 行)

--color[=WHEN]:将输出着色;WHEN 可取值 never、always 或 auto(默认值)

-D, --ifdef=NAME:输出与 "#ifdef NAME" 不同的合并文件

-d, --minimal:改变算法找出一组更小的变更。这会使 diff 变慢

-E, --ignore-tab-expansion:忽略因 Tab 扩展引起的更改

-e, --ed:输出为一个有效的 ed 脚本

-I, --ignore-matching-lines=RE:忽略匹配正则表达式 RE 的行

-i, --ignore-case:忽略大小写

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

-n, --rcs:将比较结果以 RCS 的格式来显示

--ignore-file-name-case:比较文件名时忽略大小写

--no-ignore-file-name-case:比较文件名时大小写敏感

--normal:使用正常格式输出比较结果。为默认输出格式

-p, --show-c-function:显示每个更改在哪个 C 函数中

-q, --brief:仅报告文件是否相异,忽略差别的细节

-r, --recursive:当比较目录时,递归比较子目录

-S, --starting-file=FILE:当比较目录时,由 FILE 开始。这用于继续中断的比较

-s, --report-identical-files:当两个文件相同时报告

--speed-large-files:使用启发规则加速操作那些有许多离散的小差异的大文件

-T, --initial-tab:在每行前面加上 Tab 以便对齐

-t, --expand-tabs:在输出时将 Tab 扩展为空格

--tabsize=NUM:一个 Tab 表示 NUM(默认 8) 个空格

-U NUM

-u, --unified[=NUM]:使用合并格式输出,输出 NUM(默认 3)行的统一上下文

-v, --version:输出版本信息并退出

-w, --ignore-all-space:在比较行的时候忽略空白符

-Z, --ignore-trailing-space:忽略行尾的空白符

--help:显示帮助信息并退出

--GTYPE-group-format=GFMT

用组格式 GFMT 格式化类型为 GTYPE 的输入组

--line-format=LFMT

用格式 LFMT 格式化所有输入行

--LTYPE-line-format=LFMT

用行格式 LFMT 格式化类型为 LTYPE 的输入行

上面三个选项和响应的格式提供了对输出的细粒度控制。

行类型 LTYPE 可取值 old、new 或 unchanged,组类型 GTYPE 可取值 LTYPE 或 changed。

组格式 GFMT 特含如下内容:

%< FILE1 中的行

%> FILE2 中的行

%= FILE1 和 FILE2 中共有的行

%[-][WIDTH][.[PREC]]{doxX}LETTER

使用 printf 输出风格修饰 LETTER,LETTER 使用如下字母表示新组,下面的小写字母表示旧组

F 首行行号

L 尾行行号

N 行数 = L-F+1

E 等于 F-1

M 等于 L+1

%(A=B?T:E)

if A equals B then T else E

行格式 LFMT 特含如下内容:

%L 行的内容

%l 行的内容,不包括任何尾随的换行符

%[-][WIDTH][.[PREC]]{doxX}n

使用 printf 风格修饰输入行号 n

组格式 GFMT 和行格式 LFMT 共有的内容:

%% 表示百分号 %

%c'C' 表示大写字母 C

%c'\OOO' 表示码值为八进制 000 的字符

C 其他字符

patch命令

作用:当diff比较新旧两个文件的差异后,将比较结果保存到patch文件里,然后使用patch命令利用补丁文件升级旧文件(打补丁),或把新文件回退成旧文件(卸载补丁):

命令格式

patch [OPTIONS] [ORIGFILE] < [PATCHFILE]]

[OPTIONS]:

--dry-run :模拟打补丁,不实际操作

-p N :指定要去掉的路径层数

-R :递归处理子目录中的文件

--verbose :显示详细的处理信息

--ignore-whitespace :忽略空格差异

--ignore-tab-expansion :忽略制表符扩展

--ignore-trailing-space :忽略行末空格的差异

--ignore-space-change :忽略空格的差异

--ignore-case :忽略大小写的差异

--forward :向前打补丁

--backward :向后打补丁

--strip N :去掉前缀 N 的路径名

--numeric-owner :使用数字来表示文件所有者和组

--exclude=file :从打补丁文件中排除文件

--fuzz=N :表示当某些行匹配多个修补程序时,可以放宽匹配的要求程度

--force :不检查补丁文件的正确性

--help :显示帮助信息

--version :显示版本信息

打补丁的一般流程

参考博客

diff命令:生成补丁包文件

格式: diff –Nuar 旧版本文件 新版本文件 > 补丁包文件名.patch

patch命令:打补丁命令

格式:patch –选项 <补丁包文件

例如:

假设有version1.c(低版本)和version2.c(高版本)两个文件。

可以使用 diff 命令,生成补丁包:diff –Nuar version1.c version2.c > test.patch 。

利用 cat 查看补丁包文件内容会看到首行有旧版本、新版本文件目录,接着就是“-”或“<” 或“>” 或“+”跟着要修改的内容。

“<”/“-” :后面跟着要删除的内容。

“>”/“+” :后面跟着要增加的内容。

打补丁命令

正向补丁 :patch –p0 < test.patch

反向补丁(还原) :patch –Rp0 < test.patch

(其中p代表剥离层级,0指略去patch文件0层目录,即从补丁包文件首行目录的根目录开始略去0层目录)

相关推荐

远程桌面办公显示器怎么设置全屏
365bet体育开户

远程桌面办公显示器怎么设置全屏

📅 10-17 ⭐ 9361
这些果树都可以嫁接,常见的这5种搭配,你吃过吗?
微信浏览器在哪打开网址在哪
365买球平台下载

微信浏览器在哪打开网址在哪

📅 11-09 ⭐ 2958
C语言32个关键字及其含义(非常详细)
365bet娱乐场网站

C语言32个关键字及其含义(非常详细)

📅 09-28 ⭐ 2765
只狼天狗位置
365bet娱乐场网站

只狼天狗位置

📅 07-30 ⭐ 5023
全球船公司运力排名TOP20(2024年)
365bet娱乐场网站

全球船公司运力排名TOP20(2024年)

📅 07-27 ⭐ 978
推荐阅读 ❤️