rsync除外はシェルスクリプトでは機能しません。

rsync除外はシェルスクリプトでは機能しません。

キャッシュディレクトリを除外しないこのシェルスクリプトの最小限の作業例があります。

#!/bin/sh

SRC_DIR="/home/"
DEST_DIR="/backup/test"
OPTSTR="-avzHAXx --delete --exclude '.cache'"

rsync $OPTSTR $SRC_DIR $DEST_DIR

しかし、開いて書くとうまくいくでしょう。

#!/bin/sh

rsync -avzHAXx --delete --exclude '.cache' /home/ /backup/test

問題は何ですか?

答え1

あなたの問題は文字列の使い方に関連しています$OPTSTR。これはスペースで区切られた複数の単語で構成される文字列であり、引用符なしで使用するため、シェルはそれを別の単語のリストに分割します。ただし、シェルは追加の引用符の削除ステップを実行しないため、文字列の単一引用符は言葉。したがって、コマンドは名前が'.cache'.cacheスペースやワイルドカードパターンを含む文字列を使用する必要がある場合にも問題があります。

簡単に言えば、分離する必要のある文字列に別の項目を入れないでください。

代わりにリストを使用してください。

#!/bin/sh

src_dir=/home
dest_dir=/backup/test

set -- -v -a -x -HAX --delete --exclude='.cache/'

rsync "$@" "$src_dir/" "$dest_dir"

これにより、位置引数のリストが後で使用するオプションに設定されますrsync。各引数は、拡張子が$@二重引用符で囲まれたスペースとワイルドカードを含む引用符付き文字列を含む場合でも正しく処理されます。

または、bash次を使用する場合は、名前付き配列を使用できます。

#!/bin/bash

src_dir=/home
dest_dir=/backup/test

opts=( -v -a -x -HAX --delete --exclude='.cache/' )

rsync "${opts[@]}" "$src_dir/" "$dest_dir"

また関連:

関連情報