我用下面的bash脚本只复制文件的某些扩展的(在这种情况下,* .SH),但它在所有的文件仍然副本。 怎么了?
from=$1 to=$2 rsync -zarv --include="*.sh" $from $to
我用下面的bash脚本只复制文件的某些扩展的(在这种情况下,* .SH),但它在所有的文件仍然副本。 怎么了?
from=$1 to=$2 rsync -zarv --include="*.sh" $from $to
我认为--include
用于包括那些以其他方式排除的文件的一个子集--exclude
,而不是只包括那些文件。 换句话说,你必须要考虑的重点包括意义不排除 。
尝试改为:
rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"
rsync的版本3.0.6或更高时,为了需要如下进行修改(见注释):
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
添加-m
标志将避免在目的地创建空的目录结构。 经测试,在3.1.2版本。
因此,如果我们只想* .SH文件,我们必须排除所有文件--exclude="*"
,包括所有目录--include="*/"
,并包括所有* .SH文件--include="*.sh"
。
你可以发现在部分一些很好的例子包含/排除的格局规则 手册页
通过@chepner答案将不考虑复制的事实,所有的子目录,如果它包含的文件或没有。 如果您需要排除的子目录,不包含文件和仍然保留的目录结构,使用
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
还有一个另外:如果你需要它在一个目录扩展同步文件只 (不递归),你应该使用结构是这样的:
rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/
支付你注意第一点--include
。 --no-r
并不在此建设工作。
下面是从该名男子页的重要组成部分:
由于文件的列表/目录转移而建,rsync的检查,每名反对的名单被转移包含/排除反过来模式,第一个匹配的模式采取行动:如果它是一个排除模式,那么该文件是跳过; 如果它是一个包括图案,然后该文件名不跳过; 如果没有匹配的模式被发现,则文件名不会被跳过。
总结:
另外,以斜线结束的东西是匹配的目录(如find -type d
会)。
让我们拉开这个答案从上面。
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
文件 最后, --prune-empty-directories
保存来自全国各地的地方使空目录的第一个规则。