You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写让patch命令识别的文件路径移动编码?

如何用patch命令同时重命名文件并修改内容?

问题场景

我尝试用以下bash代码,通过patch命令把story.txt重命名为kitty.txt并修改内容:

echo '# Story' > story.txt

patch -Nfu << EOF  
--- story.txt
+++ kitty.txt
@@ -1 +1 @@
-# Story
+# Kitty
EOF

echo "STORY"; cat story.txt
echo "KITTY"; cat kitty.txt

执行后结果却不符合预期:

STORY
# Kitty
KITTY
cat: kitty.txt: No such file or directory

story.txt的内容确实被修改了,但文件并没有被重命名为kitty.txt,添加--get=0 -p0 --quoting-style=literal参数也没用,求解决办法。


解决方法

方法一:用GNU patch的--rename选项(推荐,需patch 2.7.6+)

GNU patch在2.7.6版本之后添加了--rename参数,专门用来处理补丁中的文件重命名需求。修改后的代码如下:

echo '# Story' > story.txt

patch -Nfu --rename << EOF  
--- story.txt
+++ kitty.txt
@@ -1 +1 @@
-# Story
+# Kitty
EOF

echo "STORY"; cat story.txt 2>/dev/null || echo "文件不存在"
echo "KITTY"; cat kitty.txt

执行后会发现story.txt被重命名为kitty.txt,同时内容也更新为# Kitty。

方法二:手动配合mv命令(兼容所有patch版本)

如果你的patch版本较旧不支持--rename,可以分两步操作:先修改文件内容,再手动重命名:

echo '# Story' > story.txt

# 先修改story.txt的内容
patch -Nfu story.txt << EOF  
--- story.txt
+++ story.txt
@@ -1 +1 @@
-# Story
+# Kitty
EOF

# 再将文件重命名为kitty.txt
mv story.txt kitty.txt

echo "STORY"; cat story.txt 2>/dev/null || echo "文件不存在"
echo "KITTY"; cat kitty.txt

原因说明

传统的patch命令仅处理文件内容的差异变更,不会自动识别补丁中---和+++行的文件名差异来执行重命名操作。--rename选项是GNU patch后续新增的功能,用来支持这种文件重命名的补丁场景。

内容的提问来源于stack exchange,提问作者vitiral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:56:05