Linux patch 命令是用来打补丁的工具,它可以将补丁文件应用到已有的源代码中,以修复或更新其中的错误、缺陷或功能。在使用 patch 命令时,需要指定补丁文件和目标文件,以及相关选项和参数,然后 patch 命令会自动将补丁文件中的修改应用到目标文件中,从而实现补丁的安装和更新。同时,patch 命令还支持备份和回滚功能,以便在发生问题时能够恢复到原始状态。
命令名称
命令功能
用于应用补丁文件,将补丁文件中的更改应用到原文件中。
命令全称
patch
命令语法
patch [OPTIONS] [ORIGFILE [PATCHFILE]]
patch [OPTIONS] [ORIGFILE [PATCHFILE]] #[English]
命令参数
--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 #显示版本信息
命令原理
linux patch 命令是一种将补丁文件应用到源代码文件的工具,其原理是通过比较源代码文件和补丁文件的不同之处,并将补丁文件中的修改应用到源代码文件中。补丁文件记录了源代码文件中需要修改的位置以及修改的内容,通过 patch 命令将补丁文件中的修改应用到源代码文件中,从而实现源代码文件的更新和修复。
用法举例
#将补丁文件diff.patch应用到当前目录下的文件,-p1表示去掉文件路径前面的目录。
patch -p1 < diff.patch
#备份文件file.txt并将其标记为“已备份”。
patch -b file.txt
#取消对文件file.txt的补丁操作(还原文件)。
patch -R file.txt
#测试补丁文件diff.patch是否能成功应用到当前目录下的文件,但不实际应用。
patch --dry-run -p1 < diff.patch
#将补丁文件diff.patch应用到当前目录下的文件,并将输出结果保存到output.txt中。
patch -i diff.patch -o output.txt
#即使文件已经是版本,仍然尝试应用补丁文件。
patch -N file.txt
#输出已应用到文件file.txt的补丁信息。
patch -u file.txt
#安静模式,只输出错误信息,不显示详细的补丁信息。
patch -s file.txt
#允许文件与补丁文件的差异为1个字符。
patch --fuzz=1 file.txt
#显示patch命令的版本信息。
patch --version
执行权限
所有用户均可执行。
系统路径
/usr/bin/patch
注意事项
使用patch命令应注意备份原文件。
系统自带
是
常用命令
是
命令分类
文件管理类命令
参数详解
#设置为静默模式,不输出信息
linux patch --dry-run -s patchfile
#指定路径级别为1,适用于旧路径的前缀匹配
linux patch --dry-run -p1 patchfile
#指定输入文件为patchfile
linux patch --dry-run -i patchfile
#将文件patchfile中的补丁反向应用到当前目录下的文件中。
linux patch -R -i patchfile
#指定输出文件为outputfile,如果没有指定,则默认输出到标准输出流中。
linux patch --dry-run -o outputfile patchfile
#将example.patch中的变更应用到当前目录下的文件,忽略文件路径前缀
linux patch -p1 < example.patch
#将example.patch中的变更应用到当前目录下的文件,忽略文件路径前缀前两级
linux patch -p2 < example.patch
#撤销已应用到当前目录下文件的example.patch中的变更
linux patch -p1 -R < example.patch
#撤销 patch
linux patch --verbose -R file.patch
#该命令可以撤销之前对文件的修改,还原为补丁文件中的原始版本。
linux patch -R file.patch
#该命令会撤销已经应用的补丁,恢复文件原始状态。
linux patch -R -p1 test.patch
#从第路径开始取消应用指定的patch文件
linux patch -Rp1 < patchfile
#模拟应用example.patch中的变更到当前目录下的文件,但不实际修改文件。
linux patch -p2 --dry-run < example.patch
#测试 patch 文件是否可以成功应用到源文件中,但不会实际进行修改
linux patch --verbose --dry-run file.patch
#通过该命令参数可以进行模拟运行,查看patch文件是否会产生冲突或错误,而不会实际应用。
linux patch --dry-run file.patch
#模拟应用example.patch补丁文件,不实际修改文件
linux patch --dry-run example.patch
#测试应用patch.diff的内容到当前目录下的文件时不会实际修改文件
linux patch --dry-run -p1 < patch.diff
#测试补丁文件patchfile.c是否可以应用到原始文件originalfile.c中。
linux patch --dry-run patchfile.c originalfile.c
#该命令会模拟应用test.patch文件,但不会实际修改文件,只会显示应用补丁后的结果。
linux patch -p1 --dry-run test.patch
#对当前目录下的文件进行模拟打补丁操作,不会真正修改目标文件,只会输出所需修改的内容。
linux patch --dry-run test.patch
#该命令会模拟执行指定的补丁文件,但不会实际应用该补丁。
linux patch --dry-run patchfile
#该命令用于模拟应用补丁,以便用户检查补丁是否可以成功应用,但并不实际改变文件。
linux patch --dry-run originalfile patchfile
#将patchfile文件中的补丁反向应用到当前目录下的文件中,忽略补丁文件中路径前缀。
linux patch -R -p1 < patchfile
#指定被 patch 的文件路径前缀,以便 patch 命令能够正确地找到文件
linux patch --verbose -p1 file.patch
#将patchfile文件中的补丁反向应用到目录/foo/bar下的文件中。
linux patch -R -d /foo/bar < patchfile
#将patchfile文件中的补丁反向应用到当前目录下的文件中,并在应用前自动备份原文件。
linux patch -R -B < patchfile
#将patchfile文件中的补丁反向应用到当前目录下的文件中,不自动向文件尾部添加换行符。
linux patch -R -N < patchfile
#该命令将会将file.patch文件中所含的补丁文件应用于当前目录及其子目录下的文件,但会忽略补丁文件中的时间戳信息
linux patch --backward -N file.patch
#该命令会跳过已经处理过的文件,只对新文件进行补丁操作。
linux patch -N -p1 test.patch
#从第路径开始应用指定的patch文件,即使之前已经应用过
linux patch -Np1 < patchfile
#备份被修改的文件
linux patch --verbose -b file.patch
#该命令会创建备份文件,以便在应用补丁时出现错误时恢复原始文件。
linux patch -b -p1 test.patch
#列出所有被 patch 的文件
linux patch --verbose -l file.patch
#通过该命令参数可以忽略掉patch文件中的空格,可以有效避免因空格导致的错误。
linux patch --ignore-whitespace file.patch
#应用example.patch补丁文件,忽略空格的差异
linux patch --ignore-whitespace example.patch
#将补丁文件patchfile.c应用到原始文件originalfile.c中,并忽略补丁文件和原始文件中的空格差异。
linux patch --ignore-whitespace patchfile.c originalfile.c
#该命令参数用于指定忽略路径的层数,strip为1时只会去掉外层路径,strip为2时去掉两层路径,以此类推。
linux patch --strip 1 file.patch
#应用patch.diff的内容到当前目录下的文件并从文件名中删除前缀路径
linux patch --strip=1 -p1 < patch.diff
#将补丁文件patchfile.c应用到原始文件originalfile.c中,并从上下文路径中剥离一个组件。
linux patch --strip=1 patchfile.c originalfile.c
#通过该命令参数可以显示详细的操作信息,包括每个文件的修改情况、patch文件中的每个修改操作等。
linux patch --verbose file.patch
#应用patch.diff的内容到当前目录下的文件时显示详细处理信息
linux patch --verbose -p1 < patch.diff
#该命令参数用于指定拒文件的路径,当patch文件中的某些操作无法被应用时,会将这些操作保存在拒文件中。
linux patch --reject-file reject.txt file.patch
#将补丁文件patchfile.c应用到原始文件originalfile.c中,无法应用的补丁片段将保存到指定的拒文件reject.patch中。
linux patch --reject-file=reject.patch patchfile.c originalfile.c
#应用example.patch补丁文件时,剥离一层目录
linux patch --strip=1 example.patch
#回滚应用example.patch补丁文件的操作
linux patch --reverse example.patch
#反向应用patch.diff的内容到当前目录下的文件,实现反向补丁
linux patch --reverse -p1 < patch.diff
#该命令会撤销已经应用的补丁,使得系统回到该补丁应用前的状态。
linux patch --reverse patchfile
#应用example.patch补丁文件时,如果备份文件和目标文件不一致,则不进行备份。
linux patch --no-backup-if-mismatch example.patch
#将patch.diff的内容应用于当前目录下的文件,并忽略每一行末尾的空格
linux patch --ignore-trailing-space -p1 < patch.diff
#该命令可以在应用补丁时忽略代码中的空格差异。
linux patch --ignore-space-change file.patch
#该命令可以指定应用补丁时文件路径的前缀,以匹配补丁文件中的路径信息。
linux patch -p1 file.patch
#该命令将会忽略大小写以应用补丁文件。
linux patch --ignore-case file.patch
#该命令将会在file.txt文件中查找所有包含hello的字符串,忽略大小写。
linux grep -i "hello" file.txt
#该命令将会在file.txt中将所有的old替换为new,直接修改文件内容。
linux sed -i 's/old/new/g' file.txt
#该命令将会忽略大小写比较file1.txt和file2.txt的不同处。
linux diff -i file1.txt file2.txt
#该命令将会忽略大小写对file.txt文件进行排序。
linux sort -f file.txt
#将补丁文件patchfile.c应用到更高版本的原始文件originalfile.c中。
linux patch --forward patchfile.c originalfile.c
#该命令将会将file.patch文件中所含的补丁文件应用于当前目录及其子目录下的文件,截取2层路径前缀
linux patch --backward -p 2 file.patch
#该命令将会将file.patch文件中所含的补丁文件应用于当前目录及其子目录下的文件,但是将修改操作倒置
linux patch --backward -r file.patch
#该命令将会将file.patch文件中所含的补丁文件应用于当前目录及其子目录下的文件,并将修改后的文件放置到/home/user/目录下
linux patch --backward -d /home/user/ file.patch
#该命令将会测试file.patch文件中所含的补丁文件,检查它们能否被成功应用而不实际修改文件
linux patch --backward -t file.patch
#将名为example.patch的补丁文件应用到当前目录下的文件,并将层文件名前缀删除。
patch -p1 < example.patch
#将名为example.patch的补丁文件应用到/usr/local/patch/目录下,并按补丁文件内的文件名前缀查找对应的文件。
git apply --directory=/usr/local/patch/ example.patch
#将名为example.patch的补丁文件复制到/usr/local/目录下,并在复制文件时保留文件名前缀的相对路径。
rsync -av --relative example.patch /usr/local/
#将当前目录下的补丁文件应用到当前目录下的文件,并将层文件名前缀删除。
quilt push -p1
#将名为example.cpio的cpio文件解压到当前目录下,并将层文件名前缀删除。
cpio -idv --strip-components=1 < example.cpio
#使用数值UID和GID应用名为patchfile的补丁文件,并在应用时去除文件路径中的前缀,即去掉1级目录。
linux patch --numeric-owner -p1 < patchfile
#使用数值UID和GID应用名为patchfile的补丁文件,并在应用时不去除文件路径中的前缀。
linux patch --numeric-owner -p0 < patchfile
#使用数值UID和GID应用名为patchfile的补丁文件,并在应用时去除文件路径中的前缀,即去掉2级目录。
linux patch --numeric-owner -p2 < patchfile
#使用数值UID和GID反向应用名为patchfile的补丁文件,并在应用时去除文件路径中的前缀,即去掉1级目录。
linux patch --numeric-owner -R -p1 < patchfile
#使用数值UID和GID将名为patchfile的补丁文件应用到文件系统,并在应用时去除文件路径中的前缀,即去掉1级目录。如果应用补丁时需要生成备份文件,则备份文件的后缀为~。
linux patch --numeric-owner -b -p1 < patchfile
#该命令将test.patch应用于当前目录下的文件,但排除foo/bar文件,不对其进行补丁。
linux patch -p1 --exclude=foo/bar test.patch
#使用test.patch对当前目录下的文件进行打补丁操作,模糊度为3。
linux patch --fuzz=3 test.patch
#使用test.patch对当前目录下的文件进行打补丁操作,从patch文件中剥离掉前1级目录结构。
linux patch --strip=1 test.patch
#使用指定的test.patch文件对当前目录下的文件进行打补丁操作。
linux patch --input=test.patch
#使用test.patch对当前目录下的文件进行打补丁操作,当无法应用补丁时,将在rejects.txt文件中输出无法应用的补丁内容。
linux patch --reject-file=rejects.txt test.patch
#该命令会强制执行指定的补丁文件,即使当前系统已经应用过该补丁。
linux patch --force patchfile
#该命令会在执行补丁时不输出执行信息,只输出错误信息。
linux patch --quiet patchfile
#该命令会去除补丁文件中路径中的部分,应用补丁时只考虑路径后面的部分。
linux patch --strip=1 patchfile
#将应用指定的patch文件,并去掉文件路径前缀的第
linux patch -p1 < patchfile
#将应用指定的patch文件
linux patch -i patchfile
#该命令用于在应用补丁时指定路径前缀,将补丁中的相对路径转换为路径。
linux patch -p1 < patchfile
#该命令用于应用补丁时备份原始文件。
linux patch -b originalfile patchfile
#该命令用于撤销之前应用的补丁。
linux patch -R originalfile patchfile
命令报错原因
* 找不到要打补丁的文件,修改路径或文件存在;
* 补丁已经被应用过,使用-f参数强制覆盖;
* 要打的补丁已经包含在目标文件中,再次打补丁;
* 补丁文件中的文件命名错误,修改文件名;
* 补丁文件和要打补丁的文件不在同一目录下,使用-p参数指定路径;
* 要打补丁的文件被锁定或没有写权限,修改权限或使用root用户;
* 补丁文件和要打补丁的文件版本不一致,查看版本信息并选择正确的补丁文件;
* 补丁文件格式错误,检查文件格式是否正确。