両方のディレクトリを同期し、いくつかのファイルを除外したいと思います。以下のコードを試しましたが、除外に失敗しました。
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