Упорядочить файлы каталога b и его подкаталогов, равные каталогу a, без копирования или перемещения из каталога a

Проблема, с которой вы столкнулись, связана с ошибкой в ​​реализации 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
1
15.03.2020, 01:41
2 ответа

Предполагая, для простоты, что ваши исходные данные находятся в каталоге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
1
28.04.2021, 23:20

найти, sed, xargs, mkdir:

find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}
2
28.04.2021, 23:20

Теги

Похожие вопросы