web-dev-qa-db-ja.com

複数の.patchファイルを適用する

Diffを使用して生成された.patchファイルを含むディレクトリがあります。

patch -p1を使用して、これらのすべてのパッチを別のディレクトリに適用したいと思います。

しかし、私がcatでない限り、パッチは1つのファイルしか取りません。

xargsまたは同様のツールを使用して複数のファイルを適用するコマンドは何でしょうか。

8
styts

catが機能する場合は、それを使用してみませんか?

findおよびxargsを使用するには:

find dirname -name namespec -print0 | xargs -0 patch patchargs

例:

find src/networking -type f -name 'network*.patch' -print0 | xargs -0 patch -p2

Bash/sh/zshなどを使用していると仮定します...

cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < $i; done
14
James

受け入れられた答えは私にとってはうまくいきませんでした、パッチは1つのコマンドラインで複数のパッチファイルを取ることができると想定しているようです。私の解決策:

find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i

検索:パッチファイルを検索します

  • / tmp/patches:パッチファイルを検索するディレクトリ
  • -type f:ファイルのみ
  • -name '* .patch':.patchで終わるファイル
  • -print0:結果をnullで終了する文字列のリストとしてstdoutに出力します

並べ替え:パッチファイルを並べ替えて、順序を維持します(例:001が002より前)

  • -z:入力はnullで終了します(-print0を使用したため)

xargs:stdinを引数として使用してパッチを呼び出す

  • -t:コマンドを実行する前に印刷し、冗長性を減らすために削除できます
  • -0:stdinはnullで終了するリストです
  • -n 1:リスト内の1アイテムごとにpatchを再度呼び出します(たとえば、リストを作成して一度呼び出すのではなく、patchをN回呼び出します)。
  • -i:引数がパッチファイルであることを伝えるパッチへの引数
4
Ben

これは実際に機能します(Bashで):

shopt -s globstar
for file in /path/to/patches/**/*.patch
do
    patch -p1 < "$file"
done
1
l0b0