我有两个文件夹 FolderA
和 FolderB
,如下所示。我想 rsync
公共(public)子文件夹。例如,我可以执行 rsync -avzP/path/to/FolderB/*/path/to/FolderA/
,这将保留 SubFolder1
和 SubFolder3
镜像。我的问题是,如果 FolderB
是没有明确 --include
或 --exclude
单个子文件夹(例如,在以防它们太多了)。
FolderA
|--SubFolder1
|--SubFolder2
|--SubFolder3
|--SubFolder4
FolderB
|--SubFolder1
|--SubFolder3
最佳答案
您可以使用 contents FolderB
作为源更新 FolderA
中的所有文件:
rsync -uav /path/to/FolderB/ /path/to/FolderA
(注意 FolderB/
后的尾随 '/'
必须复制内容 FolderB
而不是 FolderB
本身)
反向执行并从 FolderA
更新 FolderB
而不是复制 SubFolder2
和 SubFolder4
与 --existing
选项将“跳过在接收器上创建新文件”
,但这也会阻止 SubFolder1< 中的新文件和目录
和 SubFolder3
也被创建。
您最好选择不复制 SubFolder2
和 SubFolder4
,同时允许在 SubFolder1
和 SubFolder3
中创建新文件和目录创建是使用 --filter
选项。参见 rsync(1) - Linux manual page .
使用 --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
。
编辑大量子文件夹的每条评论
如果您不想在 FolderB
下同步 FolderA
下的大量文件夹,那么您的另一个选择是创建一个包含 FolderA
的文本文件em>绝对路径 仅指向 FolderA
下的那些 SubFolderX
您想要 rsync
到 FolderB
然后使用 --no-R
和 --files-from=folderlist
选项仅rsync
想要的子文件夹。这将消除在命令行上指定大量 --filter
选项的麻烦。
例如,您可以创建文件夹列表:
find /path/to/FolderA -maxdepth 1 -type d > folderlist
(注意:在上面指定绝对路径,find
将生成包含绝对路径的folderlist
文件)
现在编辑您的 folderlist
文件并删除父目录(例如 /path/to/FolderA
)和您不想在 下同步的任何子文件夹文件夹B
。您现在可以使用 folderlist
文件来控制将 FolderA
下的哪些子文件夹同步到 FolderB
,而无需在上包含一长串过滤器命令行。然后你的命令行变成
rsync -uai -r --no-R --files-from=folderlist / /path/to/FolderB
(注意作为源的'/'
用作文件夹列表
中包含的路径的基础. 您可以更改 -i
选项来控制转储到屏幕的信息级别,例如 -v
等...或完全删除它以抑制任何报告其他比错误)
(另请注意:当使用--files-from
时,-a
并不意味着-r
(递归),因此如果需要递归传输,则需要显式添加-r
)
关于linux - 如何同步目标文件夹中存在的所有文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57263543/