rsync的副本仅分布在某些类型的使用的文件包括选项(rsync copy over only ce

2019-06-25 14:39发布

我用下面的bash脚本只复制文件的某些扩展的(在这种情况下,* .SH),但它在所有的文件仍然副本。 怎么了?

from=$1
to=$2

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

Answer 1:

我认为--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"

你可以发现在部分一些很好的例子包含/排除格局规则 手册页



Answer 2:

通过@chepner答案将不考虑复制的事实,所有的子目录,如果它包含的文件或没有。 如果您需要排除的子目录,不包含文件和仍然保留的目录结构,使用

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


Answer 3:

还有一个另外:如果你需要它在一个目录扩展同步文件 (不递归),你应该使用结构是这样的:

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

支付你注意第一点--include--no-r并不在此建设工作。



Answer 4:

下面是从该名男子页的重要组成部分:

由于文件的列表/目录转移而建,rsync的检查,每名反对的名单被转移包含/排除反过来模式,第一个匹配的模式采取行动:如果它是一个排除模式,那么该文件是跳过; 如果它是一个包括图案,然后该文件名不跳过; 如果没有匹配的模式被发现,则文件名不会被跳过。

总结:

  • 不匹配任何模式是指一个文件将被复制!
  • 该算法退出,一旦任何模式匹配

另外,以斜线结束的东西是匹配的目录(如find -type d会)。

让我们拉开这个答案从上面。

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. 不要跳过任何目录
  2. 不要跳过任何.sh文件
  3. 跳过一切
  4. (含蓄,不要不吃任何东西,但上面的规则阻止默认规则从不断发生。)

最后, --prune-empty-directories保存来自全国各地的地方使空目录的第一个规则。



文章来源: rsync copy over only certain types of files using include option