如上
我认为最好用一个例子来解释。
/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/
包括sfolder2
和sfolder4
:
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
.
要复制多个文件夹(sfolder2
和sfolder4
),您可以使用多个源路径。如果你的 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
;您可以使用-rt
if您希望避免复制所有权和权限。)