変数を使用してスクリプトでrsyncの "--exclude = {..}"オプションのターゲットを指定することはできません。

変数を使用してスクリプトでrsyncの

私の目標は、bashスクリプトに次のコマンドを実行させることです。

rsync -azhi --dry-run --exclude={'file1.txt','file2.txt','*.sql'} /from-directory/ /to-directory/

...このように抽象化すると:

srcdir='/from-directory/'
dstdir='/to-directory/'
excludes="{'file1.txt','file2.txt','*.sql'}"
rsync -azhi --dry-run --exclude="$excludes" "$srcdir" "$dstdir"

$srcdir$dstdir正しく評価しましたが、私が$excludes望んでいたほど説明されていません。コマンドラインでは、 --exclude={'file1.txt','file2.txt','*.sql'} がうまく動作します。ただし、{...}文字列を変数に埋めようとすると動作が停止します。

ベストアンサー1

配列を試してみてください。たとえば、

excludes=(file1.txt file2.txt '*.sql')
rsync -azhi --dry-run $(printf -- "--exclude=%q " "${excludes[@]}") /from-directory/ /to-directory/

しかし、これを行う場合は、*.sql一重引用符で囲まないでください。考える現在のディレクトリ内のすべての.sqlファイルに展開されます。欲しい内容ではないようで引用してみました。

これは次のように拡張されます。

rsync -azhi --dry-run --exclude=file1.txt --exclude=file2.txt --exclude=*.sql /from-directory/ /to-directory/

または:

rsync -azhi --dry-run --exclude="$(printf -- "%q," "${excludes[@]}" |
    sed -e s/,$//)" /from-directory/ /to-directory/

次に拡張予定:

rsync -azhi --dry-run --exclude=file1.txt,file2.txt,*.sql /from-directory/ /to-directory/

おすすめ記事