
У меня есть два каталога, в которых мне нужно rsync-синхронизировать содержимое только подкаталогов, которые уже присутствуют в целевом каталоге. Например:
Исходный каталог:
- папка А
- папка Б
- папка С
- папка D
- папка Е
Каталог назначения:
- папка Б
- папка D
- папка Z
Мне нужно rsync только содержимого папок B и D из источника в место назначения (а папка Z не существует в источнике, поэтому ее следует игнорировать). Точно так же мне не нужен каталог назначения, чтобы скопировать в него папки A, C и E.
По сути, «Для всех подкаталогов в месте назначения, если такой же подкаталог существует в источнике, синхронизировать содержимое этого подкаталога из источника».
Если вам это поможет, то это все локальные каталоги.
Надеюсь, это имеет смысл. Спасибо за помощь!
решение1
Вы можете использовать такой сценарий.
(
cd destination &&
for d in *
do
[ -d "$d" -a -d source/"$d" ] && rsync -a source/"$d" .
done
)
Если он автономный, то ( ... )
скобки вам не нужны, поскольку они существуют только для локализации смены каталога.
Добавьте --delete
его, rsync
если вы хотите, чтобы файлы в месте назначения удалялись, если их больше нет в источнике.
решение2
Создайте следующий bash
скрипт, измените пути к исходному и целевому каталогу и выполните его.
#!/bin/bash
source=/path_to/source_dir
destination=/path_to/destination_dir
shopt -s nullglob
{
for dir in "$destination/"*/; do
dirname=$(basename "$dir")
if [ -d "$source/$dirname" ]; then
printf '+ /%s/***\n' "$dirname"
fi
done
printf -- '- *\n'
} > "$source/filter.rules"
#rsync -av --filter="merge $source/filter.rules" "$source"/ "$destination"
Это создаст файл filter.rules
в исходном каталоге со следующим содержимым:
+ /folder B/***
+ /folder D/***
- *
Первая строка + /folder B/***
— это краткий синтаксис для
+ /folder B/
включить каталог+ /folder B/**
включить файлы и подкаталоги
и - *
исключает файлы и каталоги в корне.
Если правила выглядят так, как ожидалось, раскомментируйте последнюю строку и снова запустите скрипт для rsync
каталогов, используя фильтр слияния.
решение3
Флаг --existing
— это то, что вы ищете. Из страницы руководства:
--existing, --ignore-non-existing
This tells rsync to skip creating files (including
directories) that do not exist yet on the destination. If this option is combined
with the --ignore-existing option, no files will be updated (which can be useful
if all you want to do is delete extraneous files).
This option is a transfer rule, not an exclude, so it doesn’t affect the data that
goes into the file-lists, and thus it doesn’t affect deletions. It just limits
the files that the receiver requests to be transferred.