这是diff -u "temp temp/docs 1.txt" "temp temp/docs 2.txt"
的输出:
--- temp temp/docs 1.txt Mon Apr 7 16:15:08 2014
+++ temp temp/docs 2.txt Mon Apr 7 16:18:45 2014
@@ -2,6 +2,6 @@
22
333
4444
-555555
+55555
666666
7777777
但是,将此差异提供给patch -u
会失败,并显示以下消息:
can't find file to patch at input line 3
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|--- temp temp/docs 1.txt Mon Apr 7 16:15:08 2014
|+++ temp temp/docs 2.txt Mon Apr 7 16:18:45 2014
--------------------------
显然,空间是问题所在;有没有办法让patch
处理名称中带空格的文件?
答案 0 :(得分:2)
不,GNU补丁不支持此功能。以下是官方声明:http://www.gnu.org/software/diffutils/manual/html_node/Unusual-File-Names.html#Unusual%20File%20Names
答案 1 :(得分:0)
我在尝试建立如何使用diff和patch进行手动版本控制的约定时遇到了同样的问题。
我发现GNU“diff”在补丁标题中创建引用的路径名称(如果它们包含空格),而BusyBox“diff”则不包含空格。
GNU和BusyBox“patch”都不接受引用的路径名。
如果问题只是文件名中的嵌入空格,那么可以通过使用“busybox patch”而不是GNU“patch”来避免它。
另一个解决方案是在将GNU“diff”输出到“patch”之前对其进行后期处理:
sed 's,^\([-+]\{3\} \)"\([^"]*\)",\1\2,' $PATCHFILE | patch -p1
无论$ PATCHFILE是使用GNU还是busybox diff创建的,这都有效,但只能使用统一的diff格式。
不幸的是,事实证明,使用此方法无法保留文件名中的前导或尾随空格,因为“补丁”在从补丁说明中解析路径名时会跳过它们。
如果文件名以文字双引号开头,那么该方法既不会起作用 - 但是,谁使用这样的文件名呢?
然而,大多数情况下,上述方法效果很好。
最后我还尝试了一些其他方法,但不工作:
首先,我尝试用单独引用的路径名组件替换整个路径名的引用。这失败了,因为“补丁”根本不使用双引号作为元字符。它认为它们是正常的字面字符。
然后我尝试将所有空格替换为“\ 040”,就像CVS一样 - 但“补丁”似乎也不接受八进制转义,这也失败了。
答案 2 :(得分:0)
Gnu补丁2.6.1(linux)似乎服从至少1个空格(未尝试更多)如果文件名与日期与标签分开。
YYMV