我有两个文件夹FolderA
和FolderB
,如下所示。我想rsync
公用子文件夹。例如,我可以做rsync -avzP /path/to/FolderB/* /path/to/FolderA/
,这将使SubFolder1
和SubFolder3
保持镜像。我的问题是,如果FolderB
是目的地,而没有明确的--include
或--exclude
个单独的子文件夹(例如,如果它们太多的话),我将如何实现相同的目标。
FolderA
|--SubFolder1
|--SubFolder2
|--SubFolder3
|--SubFolder4
FolderB
|--SubFolder1
|--SubFolder3
答案 0 :(得分:0)
您可以使用 内容 {strong> FolderA
作为常规的源来更新FolderB
中的所有文件:
rsync -uav /path/to/FolderB/ /path/to/FolderA
(注意:在'/'
之后的结尾FolderB/
是复制{{1的 内容 }},而不是FolderB
本身
要反向执行此操作,并从FolderB
更新FolderB
,不要使用FolderA
选项复制SubFolder2
和SubFolder4
,--existing
,但是这也会阻止在"skip creating new files on receiver"
和SubFolder1
中创建新文件和目录。
在允许创建SubFolder3
和SubFolder2
中的新文件和目录的同时,不复制SubFolder4
和SubFolder1
的最佳选择是使用SubFolder3
选项。参见rsync(1) - Linux manual page。
在从--filter
到--filter
的副本上使用SubFolder2
排除SubFolder4
和FolderA
的典型方法是:
FolderB
这将使您可以将rsync -uav --filter -_SubFolder2/ --filter -_SubFolder4/ /path/to/FolderA/ /path/to/FolderB
的完整内容复制到/path/to/FolderA/
,而无需包含/path/to/FolderB/
和SubFolder2
。
在大量子文件夹上按评论编辑
如果您不想在SubFolder4
下进行同步,而在FolderA
下有大量文件夹,那么另一种选择是创建一个包含绝对路径的文本文件仅将您要FolderB
到SubFolderX
的{{1}}下的FolderA
,然后将rsync
和FolderB
选项仅用于{{ 1}}所需的子文件夹。这样就不必在命令行上指定大量的--no-R
选项。
例如,您可以使用以下方法创建文件夹列表:
--files-from=folderlist
(注意:在上方指定绝对路径,rsync
将产生包含绝对路径的--filter
文件)
现在编辑您的find /path/to/FolderA -maxdepth 1 -type d > folderlist
文件并删除父目录(例如find
)以及您不想在folderlist
下同步的所有子文件夹。现在,您可以使用folderlist
文件来控制将/path/to/FolderA
下的哪些子文件夹同步到FolderB
,而不必在命令行中包含一长串过滤器。您的命令行将变为
folderlist
(注意:FolderA
作为 source 作为FolderB
中包含的路径的基础。您可以更改{{1 }}选项来控制转储到屏幕上的信息的级别,例如rsync -uai -r --no-R --files-from=folderlist / /path/to/FolderB
等...或将其全部删除以禁止显示除错误以外的任何报告)
(也请注意::在使用'/'
时,folderlist
并不意味着-i
(递归),因此您需要显式添加{{1} }(如果您需要递归传输)