【发布时间】:2018-12-20 12:48:55
【问题描述】:
最近在学习diff和patch。我创建了两个文件,文件a 内容abc 和文件b 内容def。然后我使用了diff -u a b > p和patch < p,它的行为正确,如下图所示:
[joe@joe-pc c]$ ls
a b
[joe@joe-pc c]$ more a
abc
[joe@joe-pc c]$ more b
def
[joe@joe-pc c]$ diff -u a b > p
[joe@joe-pc c]$ more p
--- a 2018-12-20 22:56:33.865661540 +0800
+++ b 2018-12-20 22:54:15.241516269 +0800
@@ -1 +1 @@
-abc
+def
[joe@joe-pc c]$ patch < p
patching file a
[joe@joe-pc c]$ more a
def
[joe@joe-pc c]$ more b
def
[joe@joe-pc c]$ ls
a b p
[joe@joe-pc c]$
但是如果我将文件名从a 更改为ab,就会发生一些奇怪的事情。 patch < p 命令告诉我patching file b
Reversed (or previously applied) patch detected! Assume -R? [n]
[joe@joe-pc c]$ ls
ab b
[joe@joe-pc c]$ more ab
abc
[joe@joe-pc c]$ more b
def
[joe@joe-pc c]$ diff -u ab b > p
[joe@joe-pc c]$ more p
--- ab 2018-12-20 22:57:29.767980973 +0800
+++ b 2018-12-20 22:54:15.241516269 +0800
@@ -1 +1 @@
-abc
+def
[joe@joe-pc c]$ patch < p
patching file b
Reversed (or previously applied) patch detected! Assume -R? [n] ^C
[joe@joe-pc c]$
文件内容相同,但是为什么在第二种情况下patch找不到要修补的正确文件ab?
以上操作是在带有bash shell的Linux机器上进行的。
提前致谢。
【问题讨论】:
-
感谢您的建议。我认为屏幕截图更“真实”。现在我已将终端输出粘贴到我的问题中。
-
很棒的问题。根据一些随机的[opennet.ru/cgi-bin/opennet/man.cgi?topic=patch](man补丁),它应该自动推断文件名是
ab,但在你的情况下它使用b。 -
对我来说看起来像是一个错误:当我将文件命名为
ac/b时它也不起作用,但与ac/bd一起使用。如果我完全删除第二个文件,它也会开始使用任何名称组合。