RSYNC:排除多个文件

RSYNC:排除多个文件

我想同步两个目录并排除一些文件。我尝试了下面的代码,但排除失败。

FILES=abc.zip,hh.sh,Workarea/test/hi.jpg
rsync -av --exclude={$FILES} /home/test/ /home/test2

为了验证它,我已执行为

# sh -x test.sh
+ FILES=abc.zip,hh.sh,Workarea/test/hi.jpg
+ rsync -av '--exclude={abc.zip,hh.sh,Workarea/test/hi.jpg}' /home/test/ /home/test2

答案1

您不能将bash扩展{a,b,c}用作除文字之外的任何内容(您不能将a,b,c或什至{a,b,c}放入变量中并直接扩展它。您可以使用,eval但这会带来很多意想不到的复杂性,我真的不推荐它:

FILES=abc.zip,hh.sh,Workarea/test/hi.jpg
eval rsync -av --exclude={$FILES} /home/test/ /home/test2    # Don't do this!

一切都好

这里有一个更好的替代建议,它使用bash数组功能来保存排除集。然后我们rsync通过迭代来构建命令行。

files=(abc.zip hh.sh Workarea/test/hi.jpg "Some file with a space in its name")

excludes=()
for f in "${files[@]}"
do
    excludes+=(--exclude "$f")
done
rsync -av "${excludes[@]}" /home/test/ /home/test2

相关内容