应用多个 .patch 文件

sty*_*yts 11 bash patch diff xargs

我有一个包含.patch文件的目录,使用 diff 生成。

我想将所有这些补丁应用patch -p1到另一个目录。

但是补丁只需要一个文件,除非我cat.

使用xargs或类似工具应用多个文件的命令是什么。

Jam*_*mes 17

假设您正在使用 bash/sh/zsh 等...

cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < $i; done
Run Code Online (Sandbox Code Playgroud)


小智 10

接受的答案对我不起作用,似乎假设补丁可以在一个命令行上使用多个补丁文件。我的解决方案:

find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i
Run Code Online (Sandbox Code Playgroud)

Find:查找补丁文件

  • /tmp/patches:搜索补丁文件的目录
  • -type f:仅文件
  • -name '*.patch': 以 .patch 结尾的文件
  • -print0:将结果作为以空字符结尾的字符串列表输出到标准输出

排序:对补丁文件进行排序以保持顺序(例如 001 在 002 之前)

  • -z:输入为空终止(因为我们使用了 -print0)

xargs:使用标准输入作为参数调用补丁

  • -t:运行前打印命令,可以删除它以减少冗长
  • -0:stdin 是一个空终止的列表
  • -n 1:为列表中的每一项再次调用 patch (例如调用 patch N 次,而不是构建一个列表并调用一次)
  • -i:补丁的参数告诉它参数将是补丁文件


Den*_*son 3

如果cat有效,为什么不使用它呢?

使用findxargs

find dirname -name namespec -print0 | xargs -0 patch patchargs
Run Code Online (Sandbox Code Playgroud)

例子:

find src/networking -type f -name 'network*.patch' -print0 | xargs -0 patch -p2
Run Code Online (Sandbox Code Playgroud)