Wenden Sie mehrere .patch-Dateien an

8

Ich habe ein Verzeichnis mit .patchDateien, die mit diff generiert wurden.

Ich möchte all diese Patches mit patch -p1auf ein anderes Verzeichnis anwenden .

Aber Patch nimmt nur eine Datei, es sei denn ich cat.

Was wäre der Befehl, um mehrere Dateien mit xargsoder einem ähnlichen Tool anzuwenden .

Styts
quelle
1
Warum stimmen Sie sie dann nicht ab?
womble
Ein Ruf von 15 ist erforderlich, um zu stimmen.
Styts
2
ah, endlich genug punkte .. beide lösungen positiv bewertet!
Styts

Antworten:

2

Wenn es catfunktioniert, warum nicht?

Zu verwenden findund xargs:

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

Beispiel:

find src/networking -type f -name 'network*.patch' -print0 | xargs -0 patch -p2
Bis auf weiteres angehalten.
quelle
Was ist Namespec? Könnten Sie [] um das setzen, was Sie ändern sollten?
OZZIE
1
@OZZIE: "Namespec" repräsentiert beispielsweise einen Dateiglob 'network*'.patch. Ich habe ein Beispiel hinzugefügt.
Bis auf weiteres angehalten.
Müssen Sie die Patch-Dateien sortieren?
wahnsinniger Igel
@dementedhedgehog: Möglicherweise müssen Sie sie sortieren, da findsie in der Reihenfolge ausgegeben werden , in der sie gefunden werden. Verwenden sort -zSie diese
Option,
14

Angenommen, Sie verwenden bash / sh / zsh etc ...

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

Akzeptierte Antwort hat bei mir nicht funktioniert, es scheint anzunehmen, dass Patch mehrere Patch-Dateien in einer Befehlszeile aufnehmen kann. Meine Lösung:

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

Suchen: Findet Patch-Dateien

  • / tmp / patches: Das Verzeichnis, in dem nach Patch-Dateien gesucht werden soll
  • -Typ f: nur Dateien
  • -name '* .patch': Dateien, die mit .patch enden
  • -print0: Ausgabeergebnisse an stdout als Liste von nullterminierten Zeichenfolgen

Sortieren: Sortiert Patch-Dateien so, dass die Reihenfolge erhalten bleibt (z. B. 001 kommt vor 002)

  • -z: Eingabe ist nullterminiert (da wir -print0 verwendet haben)

xargs: Patch mit stdin als Argument aufrufen

  • -t: Druckbefehl vor dem Ausführen, kann ihn für weniger Ausführlichkeit entfernen
  • -0: stdin ist eine Liste, die mit Null abgeschlossen ist
  • -n 1: Rufen Sie den Patch für jedes Element in der Liste erneut auf (z. B. rufen Sie den Patch N-mal auf, anstatt eine Liste zu erstellen und sie einmal aufzurufen).
  • -i: Argument zum Patchen, um ihm mitzuteilen, dass das Argument die Patchdatei ist
Ben
quelle
1

Das funktioniert tatsächlich (in Bash):

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