Проблема, с которой вы столкнулись, связана с ошибкой в реализации AIX patch
. В частности, по крайней мере некоторые версии реализации AIX patch
предполагают, что файлы различий унифицированного контекста будут иметь ошибочную форму, созданную (по крайней мере некоторыми версиями )утилиты AIX diff
. Указанная ошибочная форма не соответствует POSIX и содержит пробел во втором столбце каждой строки контекста и каждой добавленной или удаленной строки.
Для использования унифицированного сравнения контекста (в форме, описанной в POSIX ), с затронутыми версиями утилиты AIX patch
, необходимо вставить пробел во второй столбец каждой из строк, представляющих контекст., добавления или удаления.
Для описанного вами файла Modified.patch
скорректированный файл исправления может быть создан с использованием:
( head -n 4 Modified.patch; tail -n +5 Modified.patch |
sed 's/^$/ /; s/^\([ +-]\)/\1 /;' ) > Adjusted.patch
Предполагая, для простоты, что ваши исходные данные находятся в каталогеa
:
a
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4
и что у вас есть каталог b
, который содержит те же файлы, что и a
,организована как другая структура каталогов:
b
├── d1
│ └── f3
├── d2
│ ├── f1
│ └── f2
└── d3
└── f4
Переупорядочить файлы в b
в соответствии с иерархией a
без копирования чего-либо из a
вb
:
export orig=a dest=b
find "$orig" -type f -exec sh -c '
for file; do
target=$dest${file#$orig}
target=${target%/*}
mkdir -p -- "$target"
find "$dest" -type f -name "${file##*/}" \
-exec mv -i -- \{\} "$target/" \;
done
' mysh {} +
Это не -действительно -эффективный код, (он порождает новый find
процесс для каждого файла вa
):
a
, a
на b
, makedir -p
не жалуется на уже существующие каталоги, а также создает все необходимые родительские каталоги ), b
, названный текущим, и перемещает их в целевой каталог; mv -i
спрашивает перед перезаписью, чтобы избежать потери данных, если два файла в разных подкаталогах b
имеют одинаковое имя. Затем вы можете удалить обычные файлы или каталоги в b
(, такие как d3
в нашем примере ), которых нет вa
:
export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
target=$orig${1#$dest}
[ ! -e "$target" ]
' mysh {} \; -delete
Окончательный результат::
b
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4
найти, sed, xargs, mkdir:
find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}