キャッシュディレクトリを除外しないこのシェルスクリプトの最小限の作業例があります。
#!/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"
また関連: