怎样在Linux中对文件应用补丁(并创建补丁)
Linuxpatch可让您快速安全地将修改从一组文件传输到另一组文件。了解如何以简单的方法使用patch。
patch和diff
假定您的计算机上有一个文本文件。您从其他人那儿收到了该文本文件的更改版本。您怎么快速将所有修改从更改后的文件传输到原始文件?这就是patch和diff发挥作用的地方。patch和diff可在Linux和其他类Unix操作系统(比如macOS)中找到。
diff复查文件的两个不同版本并列举它们之间的差别。差别可以储存在称为补丁文件的文件中。
patch命令可以读取补丁文件并将内容用作一组指令。根据这种说明,更改后的文件中的修改将复制到原始文件中。
如今想像一下这个过程发生在整个文本文件目录中。一气呵成。这就是patch的力量。
有时您不会收到更改后的文件。您收到的只是补丁文件。当您可以发送一个文件或发布一个文件以易于下载时,为何还要发送几十个文件呢?
你怎么处理补丁文件来实际修复你的文件?不仅几乎是一个绕口令之外,这也是一个挺好的问题。我们将在本文中向您介绍。
patch命令最常被使用软件源代码文件的人使用,但它同样适用于任何文本文件集,无论它们的目的是哪些,源代码与否。
我们的示例场景
在这些情况下,我们坐落一个名为work的目录中linux源代码分析,该目录包含另外两个目录。一个称作workinglinux 应用patch,另一个称作latest。工作目录包含一组源代码文件。latest目录包含那些源代码文件的最新版本,其中一些已被更改。
为了安全起见,工作目录是当前版本文本文件的副本。它不是它们的惟一副本。
查找文件的两个版本之间的差别
diff命令找出两个文件之间的差别。它的默认操作是在终端窗口中列举更改的行。
一个文件称为slang.c。我们会将工作目录中的版本与最新目录中的版本进行比较。
-u(统一)选项告诉diff还列举每位修改部份前后的一些未更改的文本行。那些行称为上下文行。它们帮助patch命令精确定位原始文件中必须进行修改的位置。
我们提供文件的名称,便于diff晓得要比较什么文件。首先列举原始文件,之后列举更改后的文件。这是我们向diff发出的命令:
diff -u working/slang.c latest/slang.c
diff生成一个显示文件之间差别的输出列表。假如文件相同,则根本不会列举任何输出。从diff中见到这种类型的输出可以确认两个文件版本之间存在差别,但是原始文件须要修复。
制做补丁文件
要在补丁文件中捕获那些差别,请使用以下命令。它与前面的命令相同,diff的输出被重定向到一个名为slang.patch的文件中。
diff -u working/slang.c latest/slang.c > slang.patch
补丁文件的名称是任意的。你可以随便尊称它。给它一个“.patch”扩展名是个好主意;并且,由于它确实清楚地表明了它是哪些类型的文件。
要使patch作用于补丁文件并更改working/slang.c文件,请使用以下命令。-u(统一)选项让patch晓得补丁文件包含统一的上下文行。换句话说,我们将-u选项与diff一起使用,因而我们将-u选项与patch一起使用。
patch-uworking/slang.c-islang.patch
倘若一切顺利,将有一行输出告诉您patch正在修复文件。
制做原始文件的备份
我们可以使用-b(备份)选项指示patch在补丁文件被修改之前制做备份副本。-i(输入)选项告诉patch要使用的补丁文件的名称:
patch -u -b working/slang.c -i slang.patch
该文件像先前一样打补丁,输出没有显著差别。并且,假如您查看工作文件夹,您会听到名为slang.c.orig的文件已创建。文件的日期和时间戳显示slang.c.orig是原始文件,而slang.c是由patch创建的新文件。
对目录使用diff
我们可以使用diff创建一个补丁文件linux培训学校,其中包含两个目录中文件之间的所有差别。之后,我们可以使用带有patch的补丁文件linux 应用patch,通过单个命令将这种差别应用于工作文件夹中的文件。
我们将与diff一起使用的选项是我们之前使用过的-u(统一上下文)选项,-r(递归)选项使diff查看任何子目录和-N(新文件)选项。
-N选项告诉diff怎样处理最新目录中不在工作目录中的文件。它强制diff将指令装入补丁文件中,便于patch创建在最新目录中存在但在工作目录中缺位的文件。
您可以将选项组合在一起,便于它们使用单个连字符(-)。
请注意,我们只提供目录名称,我们并没有告诉diff查看特定文件:
diff -ruN working/ latest/ > slang.patch
深入了解补丁文件
让我们快速浏览一下补丁文件。我们将使用less来查看它的内容。
文件底部显示了两个版本的slang.c之间的差别。
进一步向上滚动补丁文件,我们看见它此后描述了另一个名为structs.h的文件中的修改。这验证补丁文件肯定包含多个文件的不同版本之间的差别。
三思而后行
修复大量文件可能有点令人不安,因而我们将使用--dry-run选项来检测一切是否正常,之后再尝试并承诺进行修改.
--dry-run选项告诉patch执行除实际更改文件之外的所有操作。patch将对文件执行所有飞行前检测,假如遇见任何问题,它会报告那些问题。无论哪种方法,都不会更改任何文件。
倘若未报告任何问题,我们可以在不使用--dry-run选项的情况下重复该命令,并自信地修复我们的文件。
-d(目录)选项告诉patch在那个目录上工作。
请注意,我们不是使用-i(输入)选项来告诉patch那个补丁文件包含来自diff。相反,我们使用
本文原创地址://gulass.cn/ksaqdjggcyzw.html编辑:刘遄,审核员:暂无