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

関連情報