如何同步目标文件夹中存在的所有文件夹
How to rsync all folders present on the destination folder
我有两个文件夹 FolderA
和 FolderB
,如下所示。我想要 rsync
公共子文件夹。例如,我可以执行 rsync -avzP /path/to/FolderB/* /path/to/FolderA/
,这将保持 SubFolder1
和 SubFolder3
镜像。我的问题是,如果 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
选项复制 SubFolder2
和 SubFolder4
这将 "skip creating new files on receiver"
、,但这也将阻止 在 SubFolder1
和 SubFolder3
中创建新文件和目录。
不复制 SubFolder2
和 SubFolder4
而允许在 SubFolder1
和 SubFolder3
中创建新文件和目录的最佳选择是使用 --filter
选项。参见 rsync(1) - Linux manual page。
在从 FolderA
到 FolderB
的副本中使用 --filter
排除 SubFolder2
和 SubFolder4
的典型方法是:
rsync -uav --filter -_SubFolder2/ --filter -_SubFolder4/ /path/to/FolderA/ /path/to/FolderB
这将允许您将 /path/to/FolderA/
的完整内容复制到 /path/to/FolderB/
,而不包括 SubFolder2
和 SubFolder4
。
编辑大量子文件夹的每条评论
如果您不想在 FolderB
下同步 FolderA
下的大量文件夹,那么您的另一个选择是创建一个包含 的文本文件绝对路径 仅指向 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
)和您不想在 FolderB
下同步的任何子文件夹。您现在可以使用 folderlist
文件来控制将 FolderA
下的哪些子文件夹同步到 FolderB
,而无需在命令行中包含一长串过滤器。然后你的命令行变成
rsync -uai -r --no-R --files-from=folderlist / /path/to/FolderB
(注意: '/'
作为 source 作为 folderlist
中包含的路径的基础。您可以更改 -i
选项来控制转储到屏幕的信息级别,例如 -v
等...或完全删除它以抑制除错误之外的任何报告)
(另请注意: 使用 --files-from
时,-a
并不意味着 -r
(递归),因此您需要明确如果需要递归传输,请添加-r
)
我有两个文件夹 FolderA
和 FolderB
,如下所示。我想要 rsync
公共子文件夹。例如,我可以执行 rsync -avzP /path/to/FolderB/* /path/to/FolderA/
,这将保持 SubFolder1
和 SubFolder3
镜像。我的问题是,如果 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
选项复制 SubFolder2
和 SubFolder4
这将 "skip creating new files on receiver"
、,但这也将阻止 在 SubFolder1
和 SubFolder3
中创建新文件和目录。
不复制 SubFolder2
和 SubFolder4
而允许在 SubFolder1
和 SubFolder3
中创建新文件和目录的最佳选择是使用 --filter
选项。参见 rsync(1) - Linux manual page。
在从 FolderA
到 FolderB
的副本中使用 --filter
排除 SubFolder2
和 SubFolder4
的典型方法是:
rsync -uav --filter -_SubFolder2/ --filter -_SubFolder4/ /path/to/FolderA/ /path/to/FolderB
这将允许您将 /path/to/FolderA/
的完整内容复制到 /path/to/FolderB/
,而不包括 SubFolder2
和 SubFolder4
。
编辑大量子文件夹的每条评论
如果您不想在 FolderB
下同步 FolderA
下的大量文件夹,那么您的另一个选择是创建一个包含 的文本文件绝对路径 仅指向 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
)和您不想在 FolderB
下同步的任何子文件夹。您现在可以使用 folderlist
文件来控制将 FolderA
下的哪些子文件夹同步到 FolderB
,而无需在命令行中包含一长串过滤器。然后你的命令行变成
rsync -uai -r --no-R --files-from=folderlist / /path/to/FolderB
(注意: '/'
作为 source 作为 folderlist
中包含的路径的基础。您可以更改 -i
选项来控制转储到屏幕的信息级别,例如 -v
等...或完全删除它以抑制除错误之外的任何报告)
(另请注意: 使用 --files-from
时,-a
并不意味着 -r
(递归),因此您需要明确如果需要递归传输,请添加-r
)