Назад | Перейти на главную страницу

Применить несколько файлов .patch

У меня есть каталог с .patch файлы, созданные с помощью diff.

Я хотел бы применить все эти патчи, используя patch -p1 в другой каталог.

Но патч берет только один файл, если я не cat.

Какой была бы команда для применения нескольких файлов с помощью xargs или аналогичный инструмент.

Предполагая, что вы используете bash / sh / zsh и т. Д.

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

Принятый ответ не сработал для меня, кажется, предполагается, что патч может принимать несколько файлов патчей в одной командной строке. Мое решение:

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: выводить результаты на стандартный вывод в виде списка строк с завершающим нулем

Сортировка: сортирует файлы патчей, сохраняя порядок (например, 001 предшествует 002).

  • -z: ввод завершается нулем (поскольку мы использовали -print0)

xargs: Вызов патча с использованием stdin в качестве аргументов

  • -t: печатать команду перед ее запуском, можно удалить ее для меньшего количества подробностей
  • -0: stdin - это список с завершающим нулем
  • -n 1: повторно вызвать патч для каждого 1 элемента в списке (например, вызвать патч N раз, вместо того, чтобы создавать список и вызывать его один раз)
  • -i: аргумент патча, чтобы указать, что аргументом будет файл патча

Если 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):

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