Рекурсивно копировать только определенные каталоги, которые соответствуют шаблонам, указанным в файле

Так что я решил проблему самостоятельно. Я где-то читал, что действительно старые версии mdadmиспользовали меньше метаданных, а новые версии использовали больше. Поскольку я перешел с системы Ubuntu 10.10 на CentOS 6.9 (, несмотря на то, что он успешно монтировался на CentOS 6.9 в течение нескольких недель ), я решил, что это объясняет, почему /dev/md0устройство было меньше исходного PV.. Как только я загрузил резервную копию системы Ubuntu 10.10, собрал рейд и запустил vgcfgrestoreна исходной группе томов, рейд смонтировался нормально, и мои данные снова стали доступны.

Таким образом, в основном файловые системы рейда, построенные на очень старых версиях mdadm, не следует монтировать непосредственно в новые дистрибутивы Linux.

3
11.07.2018, 11:43
1 ответ

Используя файл строк, которые должны присутствовать в именах каталогов, цикл оболочки по ним иrsync(предполагая, что мы хотим скопировать из каталога в переменной $sourceи в каталог в переменной$target):

while IFS= read -r string; do
    rsync --archive --exclude='*DAT*/' --include='*/' --include="*$string*_Full/***" --exclude='*' \
        --prune-empty-dirs "$source"/ "$target"
done <strings.txt

Что делает опция rsync(первое попадание в любой из шаблонов исключения/включения имеет значение):

  • --archive:Копирует права собственности, разрешения, метки времени и т. д.
  • --exclude='*DAT*/':Исключить любой каталог с DATв его имени.
  • --include='*/':Учитывать все каталоги (, кроме исключенных предыдущим шаблоном ). Это необходимо для rsyncдоступа к фактически интересующим вас каталогам.
  • --include="*$string*_Full/***":Считать все каталоги, соответствующие данному шаблону и все, что ниже этого каталога. Если $stringравно parrot, это будет --include="*parrot*_Full/***".
  • --exclude='*':Не рассматривайте ничего, что еще не включено явно.
  • --prune-empty-dirs:Не передавайте каталоги, в которые ничего явно не включено.

Если вы хотите увидеть, как rsyncоценивает шаблоны при запуске, добавьте -vvв командную строку rsync.

Тестирование:

$ tree
.
|-- from
|   `-- a
|       `-- b
|           |-- c_A_DATFull
|           |   `-- file
|           |-- c_A_DAT_Full
|           |   `-- file
|           |-- c_A_Full
|           |   `-- file
|           |-- c_B_DATFull
|           |   `-- file
|           |-- c_B_DAT_Full
|           |   `-- file
|           |-- c_B_Full
|           |   `-- file
|           |-- c_C_DATFull
|           |   `-- file
|           |-- c_C_DAT_Full
|           |   `-- file
|           `-- c_C_Full
|               `-- file
`-- strings.txt

12 directories, 10 files

$ cat strings.txt
A
B

$ source=from
$ target=to

(запуск цикла здесь)

$ tree
.
|-- from
[...]
`-- to
    `-- a
        `-- b
            |-- c_A_Full
            |   `-- file
            `-- c_B_Full
                `-- file

17 directories, 12 files

Одним вызовомrsync:

set -- --exclude='*DAT*/' --include='*/'
while IFS= read -r string; do
    set -- "$@" --include="*$string*_Full/***"
done <strings.txt
set -- "$@" --exclude='*'

rsync --archive "$@" --prune-empty-dirs "$source"/ "$target"

A findрешение:

set --
while IFS= read -r string; do
    set -- "$@" -o -name "*$string*_Full"
done <strings.txt
shift

# "$@" would now be something like
#    -name *LP02323*_Full -o -name *Paaaf*_Full -o -name...etc

find "$source" -type d '(' "$@" ')' ! -name '*DAT*' -exec sh -c '
    source=$1; target=$2; shift 2
    for pathname do
        mkdir -p "$target/${pathname#$source}"
        rsync --archive "$pathname"/ "$target/${pathname#$source}"
    done' sh "$source" "$target" {} +

Это будет использовать findдля создания списка подкаталогов, которые вы хотите скопировать. Они даны небольшому встроенному сценарию, который зацикливается на них.

В каждой итерации цикла создается соответствующий каталог на цели (, это предполагает локальную копию ), и каталог копируется с использованием rsync.

Никогда не используйте пути от findдо по каналу для какой-либо другой команды, если только вы не можете обеспечить безопасное разграничение имен путей.

Связанные:

2
27.01.2020, 21:30

Теги

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