rsync только существующие подкаталоги в месте назначения

rsync только существующие подкаталоги в месте назначения

У меня есть два каталога, в которых мне нужно 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.

Связанный контент