Так что я решил проблему самостоятельно. Я где-то читал, что действительно старые версии mdadm
использовали меньше метаданных, а новые версии использовали больше. Поскольку я перешел с системы Ubuntu 10.10 на CentOS 6.9 (, несмотря на то, что он успешно монтировался на CentOS 6.9 в течение нескольких недель ), я решил, что это объясняет, почему /dev/md0
устройство было меньше исходного PV.. Как только я загрузил резервную копию системы Ubuntu 10.10, собрал рейд и запустил vgcfgrestore
на исходной группе томов, рейд смонтировался нормально, и мои данные снова стали доступны.
Таким образом, в основном файловые системы рейда, построенные на очень старых версиях mdadm, не следует монтировать непосредственно в новые дистрибутивы Linux.
Используя файл строк, которые должны присутствовать в именах каталогов, цикл оболочки по ним и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
до по каналу для какой-либо другой команды, если только вы не можете обеспечить безопасное разграничение имен путей.
Связанные: