rsync仅使用include选项复制某些types的文件

我使用下面的bash脚本来仅复制特定扩展名的文件(在本例中为* .sh),但它仍然复制所有文件。 怎么了?

从= $ 1
到= $ 16

 rsync -zarv --include =“*。sh”$ from $ to

我认为--include被用来包含文件的一个子集,否则被排除在外,而不是只包含那些文件。

改为:

 rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to" 

更新:

对于高于3.0.7的rsync版本,订单需要修改如下(见注释)

 rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to" 

@chepner的回答将复制所有的子目录,而不pipe它是否包含该文件。 如果您需要排除不包含该文件的子目录并仍保留目录结构,请使用

 rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to" 

还有一个补充:如果你需要通过在一个目录中的扩展名来同步文件(没有recursion),你应该使用这样的结构:

 rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/ 

请注意第一个点 – 包括点。 --no-r在这个结构中不起作用。