我使用以下bash脚本仅复制某些扩展名的文件(在本例中为* .sh),但是仍会复制所有文件。怎么了?
从= $ 1 至= $ 2 rsync -zarv --include =“ *。sh” $ from $ to
rsync
,这可以通过外壳内部实现吗?
我使用以下bash脚本仅复制某些扩展名的文件(在本例中为* .sh),但是仍会复制所有文件。怎么了?
从= $ 1 至= $ 2 rsync -zarv --include =“ *。sh” $ from $ to
rsync
,这可以通过外壳内部实现吗?
Answers:
我认为--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"
。
您可以在手册页的“包括/排除模式规则”部分中找到一些很好的示例。
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
。
--include=\*.sh
则--exclude=\*
)
@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
在此构造中不起作用。
编辑:
感谢gbyte.co的宝贵意见!
include
和exclude
选项。此外,它在第一个匹配的选项处停止。因此,如果--exclude '*'
在此示例中首先指定,则rsync将不执行任何操作。请参阅此人以获取更多说明。
-- include './'
是说在源目录路径中包含所有内容?然后下一个`--include'.ext'`在源路径中包含命名的特定文件.ext
,然后exclude表示不发送其他内容--exclude '*'
?那是对的吗?
--include '*.ext'
而不是--include '.ext'
这是手册页中的重要部分:
构建要传输的文件/目录列表后,rsync会根据包含/排除模式列表依次检查要传输的每个名称,然后执行第一个匹配模式:如果是排除模式,则该文件为跳过 如果是包含模式,则不跳过该文件名;如果找不到匹配的模式,则不跳过文件名。
总结一下:
同样,以斜杠结尾的东西是匹配目录(就像find -type d
这样)。
让我们从上面分开这个答案。
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
.sh
文件最后,--prune-empty-directories
保持第一条规则不要在各处创建空目录。
如果有人在寻找……我想只同步特定的文件和文件夹,并设法使用以下命令来做到这一点: rsync --include-from=rsync-files
使用rsync文件:
my-dir/
my-file.txt
- /*
编写了这个方便的功能,并放入了我的bash脚本或~/.bash_aliases
。使用bash在Linux上测试了本地同步并awk
已安装。有用
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