我想同步两个目录并排除一些文件。我尝试了下面的代码,但排除失败。
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