我有两个目录,我需要仅同步目标目录中已存在的子目录的内容。例如:
源码目录:
- 文件夹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.