如何编写让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
相关产品推荐
相关产品推荐

