borgbackupを使用するとこの問題が発生しましたが、応答は同じであるため、rsync
例ではこれを使用します。
各パラメータにプレフィックスを追加してパラメータ配列を作成し、その配列をに割り当てたいが存在しないかのように動作しますrsync
。rsync
次のスクリプトを使用してください。
#!/usr/bin/env bash
#
declare -a exclude_String
for excludestr in $(cat ./list); do
exclude_String+=(--exclude=$excludestr)
done
rsync "${exclude_String[@]}" . $Destination
そして./list
:
'/home/*'
'*.vim*'
実行中のプロセスのうち、Aはps
パラメータを正しく表示します。
/usr/bin/rsync --exclude='*.vim*' --exclude='/home/*' . DESTINATION
しかし、rsync
まだその人々がそこにいないかのように振る舞います。私が見つけたこの問題トピックに関して以下を試してください。
#!/usr/bin/env bash
#
declare -a exclude_String
exclude_String+=(--exclude='/home/*')
exclude_String+=(--exclude='*.vim*')
rsync "${exclude_String[@]}" . $Destination
これは実際に動作します。
私はまだシェル拡張やその他などについてあまり知りません。何かが見つかるかどうかを確認するために、あちこちに引用符と二重引用符を使用してみましたが、運がありませんでした。
これを達成する方法についてのアイデアはありますか?
ベストアンサー1
ファイルに実際に、'/home/*'
および引用符が含まれている場合、引用符はexcludestr
ループの値に表示され、ユーザーが指定した引数に表示されますrsync
。この場合、これはシェルコマンドの一部ではなく、コマンド置換の拡張値の一部にすぎません。
一方、exclude_String+=(--exclude='/home/*')
今、引用符で囲みます。はいシェルコマンドの一部であり、コマンド処理中に削除されます。 (*
一般キャラクターを作る効果があります。)
rsync
実際には、除外パターンの一部として引用符を期待したり処理したりするのではなく、単にそれを別の文字として扱い、名前に引用符を含むファイルを除外します。したがって、一部のファイルのデータに除外パターンがある場合は、引用符を含めないでください。
for x in $(cat file)
また、代わりにを使用するか、while IFS= read -r line; do ...; done < file
この場合はを使用してくださいmapfile -t exclude_String < file
。このコマンド置換はcat
単語区切りを呼び出すため、スペースを含む除外パターンは使用できません。また、繰り返しの単語リストからパターンのglobbingをすぐに呼び出しますfor
。あなたが望むものではありませんか?
一般的に言えば、必要なものは次のとおりです。
excludes=()
while IFS= read -r line; do
excludes+=(--exclude="$line")
done < ./list
rsync "$flags" "${excludes[@]}" . "$destination"
./list
除外するパターンのみを含める:
/home/*
*.vim*
"$line"
(内側の引用符は、+=(--exclude="$line")
シェルが--exclude=something
現在のディレクトリから呼び出されたファイルをグローブするのを防ぎます。)
この場合、以下をrsync
使用することもできます--exclude-from
。
rsync "$flags" --exclude-from=./list . "$destination"
ループを提供するためにファイルよりも複雑なものを使用したい場合は、プロセス置換を使用できます。
while IFS= read -r line; do
excludes+=(--exclude="$line")
done < <(some command that produces the exclude patterns)
また見なさい:私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?