如何同步目标文件夹中存在的所有文件夹

How to rsync all folders present on the destination folder

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

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

FolderB
|--SubFolder1
|--SubFolder3

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

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

(注意: FolderB/ 后面的 '/' 必须复制 内容 FolderB 而不是 FolderB 本身)

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

不复制 SubFolder2SubFolder4 而允许在 SubFolder1SubFolder3 中创建新文件和目录的最佳选择是使用 --filter 选项。参见 rsync(1) - Linux manual page

在从 FolderAFolderB 的副本中使用 --filter 排除 SubFolder2SubFolder4 的典型方法是:

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

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


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

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

例如,您可以创建文件夹列表:

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

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

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

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

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

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