检查文件或文件夹是否已被修补


Answers:


20

是的,只运行patch--dry-run选项,它要么成功要么失败,都可以通过退出状态找到。

但是,以更常见的方式(并且容易出错),您可能必须使用带有-R“ reverse”选项的选项来运行它,因为只有当它能够还原整个补丁程序时,它才能被视为“已应用”。否则(没有'-R')它可能会由于原始文件的某些部分被更改而失败。下面是一个简单的示例:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(甚至,在上面的代码段中,您甚至可能更喜欢沉默以patch完全将其stdout和stderr重定向到/dev/null


1
这对我不起作用。当我运行该命令时,如果尚未应用补丁,它将询问是否以交互方式“撤消”补丁;如果使用批处理模式,它将忽略反向操作并应用补丁,并返回0。
synack

1
嘿,尝试加入-sfpatch(可以写成patch -Rsfp0 --dry-run
poige

1
@synack没事吗?
poige

16

以防万一它对某人有帮助,如果您使用的是bash脚本,那么Omnifarious给出的示例将无法正常工作。在bash中,成功命令的退出状态为0

因此,以下方法将起作用:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi

检查应针对1而不是0if [ $? -eq 1 ]
Crisson 2015年

2
不,0是正确的。如果由于某种原因试运行失败,补丁将以非零值退出,在这种情况下,不应应用补丁。
Fls'Zen

我的脚本在bash中是正确的。bash考虑到trueif 的退出代码为0 。正是因为大多数命令使用退出代码0表示成功。
全方位

2

假设您正在使用该patch实用程序,并且要修补的每个文件都有其自己的修补程序,这是一个猜测:

if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi

或者,如果您之前打过补丁并且想知道它是否碰到了某个特定文件,则可以使用-B选项运行第一轮补丁,这将导致进行备份。然后,检查备份是否存在。
彼得

8
您能否扩展一下为什么选择nohup在这种if情况下使用?
zrajm

@zrajm-我不记得为什么要这么做了。到我注意到(因为有编辑批准请求)的时候,就在很久以前,我再也没有机会找回原因了。我现在看它似乎毫无意义。
凌晨

0

在我的情况下,我想进行检查,以使运行patch命令不会以交互终端询问要做什么(特别是对于CI)而结束。

事实证明,如果只需要您也可以使用--forward参数,并且它会跳过已应用的补丁!


0

这对我有用。

"scripts": {
    "symfony-scripts": [
        "patch -N --silent -p0 < patches/vendor/somefile.js.patch &2>/dev/null",
        "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.