Rsync 使用 include 选项仅复制某些类型的文件

我使用以下 bash 脚本只复制某些扩展名的文件(在本例中为 *)。然而,它仍然拷贝了所有的文件。怎么了?

from=$1
to=$2


rsync -zarv  --include="*.sh" $from $to
145347 次浏览

我认为 --include是用来包含一部分被 --exclude排除在外的文件,而不是仅仅包含这些文件。 换句话说: 你必须考虑 包括意味着 不排除

试试看:

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

对于 rsync 3.0.6或更高版本,订单需要修改如下(参见注释) :

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

添加 -m标志将避免在目标中创建空目录结构。

所以如果我们只想。Sh 文件我们必须排除所有文件 --exclude="*",包括所有目录 --include="*/"和包括所有 * 。Sh 文件 --include="*.sh"

您可以在 手册包含/排除模式规则部分中找到一些很好的例子

另外,如果你需要通过 只有一个目标中的扩展同步文件(不需要递归) ,你应该使用这样的结构:

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

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

编辑:

感谢 gbyte.co 的宝贵意见!

编辑:

-uzv标志与这个问题没有直接关系,但是我包含了它们,因为我通常使用它们。

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

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

以下是手册中的重要部分:

在构建要传输的文件/目录列表时,rsync 依次根据包含/排除模式列表检查要传输的每个名称,并执行第一个匹配模式: 如果是排除模式,则跳过该文件; 如果是包含模式,则不跳过该文件名; 如果没有找到匹配模式,则不跳过该文件名。

总结一下:

  • 不匹配任何模式意味着文件将被复制!
  • 一旦任何模式匹配,算法就会退出

另外,以斜杠结尾的内容是匹配目录(就像 find -type d那样)。

让我们从上面分析这个答案。

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. 不要跳过任何目录
  2. 不要跳过任何 .sh文件
  3. 跳过一切
  4. (含蓄地说,不要跳过任何内容,但是上面的规则可以防止默认规则的发生。)

最后,--prune-empty-directories防止第一条规则在所有地方创建空目录。

如果有人找这个..。 我希望仅同步特定的文件和文件夹,并设法使用以下命令进行同步: rsync --include-from=rsync-files

使用 rsync-files:

my-dir/
my-file.txt


- /*

编写了这个方便的函数,并将 bash 脚本或 ~/.bash_aliases放入其中。在安装了 bash 和 awk的 Linux 上进行了本地同步测试。有用

selrsync(){
# selective rsync to sync only certain filetypes;
# based on: https://stackoverflow.com/a/11111793/588867
# Example: selrsync 'tsv,csv' ./source ./target --dry-run
types="$1"; shift; #accepts comma separated list of types. Must be the first argument.
includes=$(echo $types| awk  -F',' \
'BEGIN{OFS=" ";}
{
for (i = 1; i <= NF; i++ ) { if (length($i) > 0) $i="--include=*."$i; } print
}')
restargs="$@"


echo Command: rsync -avz --prune-empty-dirs --include="*/" $includes --exclude="*" "$restargs"
eval rsync -avz --prune-empty-dirs --include="*/" "$includes" --exclude="*" $restargs
}

优点:

当需要添加更多参数时(例如,--dry-run) ,简短方便且可扩展。

例如:

selrsync 'tsv,csv' ./source ./target --dry-run