首页 > 解决方案 > 如何同步目标文件夹中存在的所有文件夹

问题描述

我有两个文件夹FolderAFolderB如下所示。我想要rsync公共子文件夹。例如,我可以做rsync -avzP /path/to/FolderB/* /path/to/FolderA/,这将保持SubFolder1SubFolder3镜像。FolderB我的问题是,如果目的地没有明确--include--exclude单独的子文件夹(例如,如果它们太多),我如何能实现相同的目标。

FolderA
|--SubFolder1
|--SubFolder2
|--SubFolder3
|--SubFolder4

FolderB
|--SubFolder1
|--SubFolder3

标签: linuxubuntucentosrsync

解决方案


FolderA您可以使用正常的内容 FolderB作为源来更新所有文件:

rsync -uav /path/to/FolderB/ /path/to/FolderA

注意:后面'/'FolderB/强制复制的内容FolderB不是FolderB自身)

反向执行它并FolderB从更新FolderA而不是复制SubFolder2SubFolder4使用--existing选项 which will 进行操作"skip creating new files on receiver"但这也将阻止新文件和目录在其中创建SubFolder1SubFolder3创建。

您最好的选择是不复制SubFolder2,同时允许在其中创建SubFolder4新文件和目录是使用该选项。请参阅rsync(1) - Linux 手册页SubFolder1SubFolder3--filter

--filter用于排除SubFolder2SubFolder4复制 from FolderAto的典型方法FolderB是:

rsync -uav --filter -_SubFolder2/ --filter -_SubFolder4/ /path/to/FolderA/ /path/to/FolderB

这将允许您复制 to 的完整内容/path/to/FolderA/而不/path/to/FolderB/包括SubFolder2and SubFolder4


编辑大量子文件夹的每条评论

FolderA如果您不想在其下同步大量文件夹FolderB,那么您的另一个选择是创建一个文本文件,其中仅包含您想要同步的文件夹的绝对路径,然后仅使用和选项子文件夹。这将消除在命令行上指定大量选项的麻烦。SubFolderXFolderArsyncFolderB--no-R--files-from=folderlistrsync--filter

例如,您可以使用以下命令创建文件夹列表:

find /path/to/FolderA -maxdepth 1 -type d > folderlist

注意:上面指定绝对路径,find会生成folderlist包含绝对路径的文件)

现在编辑您的folderlist文件并删除父目录(例如/path/to/FolderA)和您不想在FolderB. 您现在可以使用该folderlist文件来控制同步到哪些子文件夹下FolderAFolderB而不必在命令行中包含一长串过滤器。你的命令行然后变成

rsync -uai -r --no-R --files-from=folderlist / /path/to/FolderB

注意:'/' as用作 中包含的路径的基础。folderlist您可以更改-i选项以控制转储到屏幕的信息级别,例如-v,等等...或完全删除它以抑制除错误以外的任何报告)

另请注意:使用时--files-from-a并不意味着-r(递归),因此-r如果需要递归传输,则需要显式添加)


推荐阅读