FreeBSD 12.x:将特定文件夹同步到我的目标文件夹

FreeBSD 12.x:将特定文件夹同步到我的目标文件夹

如上

我认为最好用一个例子来解释。

/mnt/source/source-folder
  -> sfolder1
  -> sfolder2 
  -> sfolder3
  -> sfolder4

“sfolder”包含数十个文件夹和其中的数百个文件。

我想将“sfolder2 及其内容”复制到 /mnt/destination/destination-folder。

我试过

rsync -nriv --stats --include "sfolder2" --exclude "*" /mnt/source/source-folder/ /mnt/destination/destination-folder/

rsync -nriv --stats --include "sfolder2*" --exclude "*" /mnt/source/source-folder/ /mnt/destination/destination-folder/

rsync -nriv --stats --include "*sfolder2*" --exclude "*" /mnt/source/source-folder/ /mnt/destination/destination-folder/

在所有情况下,统计数据报告仅传输“sfolder2”文件夹,而“sfolder2”内的数十个文件夹和数百个文件被忽略。

我究竟做错了什么?

我的真正目标是将多个文件夹(来自上面的示例文件夹设置,sfolder2 和 sfolder4)从源复制到我的目标。我目前在测试时只使用 1 个文件夹。

谢谢!

答案1

您排除了“所有地方”*并包含它仅传输传输根目录中的sfolder2文件或目录。sfolder2

相反,您可以/*仅排除与源目录相关的文件。这意味着如果/sfolder3排除eg,那么内部的所有文件/sfolder3也被排除,因为父目录被排除。

使用/sfolder2/明确表明该目录是相对于源目录(/在开始处)并且是一个目录(/在结束处)。我还替换-r-a(存档模式),其中包括-r

rsync -naiv --stats --include='/sfolder2/' --exclude='/*' \
 /mnt/source/source-folder/ /mnt/destination/destination-folder/

包括sfolder2sfolder4

rsync -naiv --stats --include='/sfolder2/' --include='/sfolder4/' --exclude='/*' \
 /mnt/source/source-folder/ /mnt/destination/destination-folder/

答案2

您可以使用相对路径,从而避免所有的复杂--include情况--exclude。这里,--relative( -R) 标志指示rsync在目标处维护源路径。源中的标记/./要维护的路径的开始(没有它,整个路径将被保留)

rsync --dry-run -aivR --stats /mnt/source/source-folder/./sfolder2/ /mnt/destination/destination-folder

这会将sfolder2其内容复制到/mnt/destination/destination-folder/sfolder2.

要复制多个文件夹(sfolder2sfolder4),您可以使用多个源路径。如果你的 shell 处理支撑组{x,y},就像这样,

rsync --dry-run -aivR --stats /mnt/source/source-folder/./sfolder{2,4}/ /mnt/destination/destination-folder

或其他情况

rsync --dry-run -aivR --stats /mnt/source/source-folder/./sfolder2/ /mnt/source/source-folder/./other4/ /mnt/destination/destination-folder

(顺便说一句,不要仅使用--recursive( -r) 来复制文件树,而是使用--archive( -a) 或添加--times( -t) 来帮助rsync优化相同文件的未来副本。在我的示例中,我使用了-a;您可以使用-rtif您希望避免复制所有权和权限。)

相关内容