仅 rsync 目标中现有的子目录

仅 rsync 目标中现有的子目录

我有两个目录,我需要仅同步目标目录中已存在的子目录的内容。例如:

源码目录:

  • 文件夹A
  • 文件夹B
  • 文件夹C
  • 文件夹D
  • 文件夹E

目标目录:

  • 文件夹B
  • 文件夹D
  • 文件夹

我需要将文件夹 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.

相关内容