私の目標は、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/