返回
如何解决patch(1)无法识别带有+++文件名的错误?
Linux
2024-03-08 16:29:11
如何让 patch(1) 自动使用带有 +++ 答案的文件
问题
当你尝试使用 patch(1) 应用一个包含大量补丁的文件集时,你可能会遇到以下错误:
无法在输入第 3 行找到要修补的文件
也许你使用了错误的 -p 或 --strip 选项?
导致此问题的文本是:
--------------------------
|--- 源文件 2024-03-09 15:47:51.145613870 +0100
|+++ 目标文件 2024-03-09 16:03:27.723860711 +0100
--------------------------
要修补的文件:
这是因为 patch(1) 无法识别带有 +++ 作为文件名的文件。
解决方法
有几种方法可以解决此问题:
1. 查找原始文件名
首先,我们需要找到与带有 +++ 的文件相对应的原始文件名。我们可以通过查找文件的创建时间和内容来做到这一点:
find . -newer src -type f -printf '%T@ %P\n' | grep '+++\|[0-9]\+\.0[01]' | sort -nk1,1 | cut -d' ' -f2-
2. 使用 -e 选项
找到原始文件名后,我们可以使用 patch(1) 的 -e 选项。该选项允许我们指定用于比较文件的编辑脚本。在这种情况中,编辑脚本将删除 +++ 和文件名之间的所有内容:
patch -Np1 -i <补丁文件> -e 's/^+++ \(.*\)\n\(.*\)/\2\n/'
3. 使用 sed 命令
我们还可以使用 sed 命令删除 +++ 和文件名:
patch -Np1 -i <补丁文件> | sed -e 's/^+++ \(.*\)\n\(.*\)/\2\n/'
4. 其他方法
还有其他一些方法可以解决此问题,例如:
- 使用 git apply 命令,它可以自动处理带有 +++ 的文件名。
- 使用 patchutils 工具,它提供了一些选项来处理带有 +++ 的文件名。
- 手动修改补丁文件,将带有 +++ 的文件名替换为原始文件名。
结论
通过使用 -e 选项或 sed 命令,我们可以让 patch(1) 自动使用带有 +++ 的文件作为要修补的文件。这可以节省大量时间,尤其是当补丁集中有许多文件时。
常见问题解答
- 为什么 patch(1) 默认情况下不识别带有 +++ 的文件名?
这是因为 +++ 并不是一个标准的文件名约定。 - 我可以使用 -t 选项吗?
不行,-t 选项会完全阻止 patch(1) 应用任何补丁。 - 我可以在不使用外部工具的情况下解决此问题吗?
是的,可以使用 sed 命令删除 +++ 和文件名。 - 我可以使用正则表达式吗?
是的,可以在 -e 选项中使用正则表达式来匹配和替换 +++ 和文件名。 - 还有什么其他方法可以解决此问题?
可以使用 git apply 命令或 patchutils 工具来处理带有 +++ 的文件名。