3

何時間も探していて、まだこれを理解できません:(

とにかく、約40の異なるディレクトリを別のサーバー上の40の他のディレクトリに自動的にrsyncするスクリプトを作成しています。スクリプト全体を見たい場合は、ここで見ることができます: http://pastebin.com/Nt3KKvx9

しかし、重要なのは、rsync を実行する for ループです。

for ((i=0; i<${#websys[@]}; i++))
do
  localpath="/nusdata/staff/NUS/NUS/Systems/${kiskasys[$i]}"
  remotepath="/home/www/html/nusalaska.com/html/systems/${websys[$i]}"
  rsync -rlptnvz -s "$localpath" -e "ssh -p 50014" "nusak@webserver:$remotepath/"
done 

問題は、配列 "kiskasys" に、スペースを含む多くのディレクトリ名があることです (例: '101 greenbrook')。私は、配列変数の周りに一重引用符、二重引用符、「\」などのエスケープスペース、および3つすべての組み合わせを持たせることを試みました。また、 $localpath を引用符ではなく引用符で囲んでみました。

-s (--protect-args) がスペースを処理する方法と、自分の状況でそれを機能させる方法について混乱しているだけだと思います。

エラー出力は常に次のようになります。

rsync: change_dir "/nusdata/staff/NUS/NUS/101" failed: No such file or directory (2)

また

rsync: change_dir "/nusdata/staff/NUS/NUS/'101 greenbrook'" failed: No such file or directory (2)

どんな助けでも大歓迎です!

ありがとう

問題が見つかりました

スクリプトからこのページにコードをコピーする際に、誤って間違ってコピーしました...しかし、間違ってコピーした場合、上に投稿したのは、問題なく動作する完全に優れたコードでした。

私が上に投稿したのは、私自身の問題の解決策でした。

元の localpath 変数には、次のように一重引用符が含まれていました。

localpath="'/nusdata/staff/NUS/NUS/Systems/${kiskasys[$i]}'"

一重引用符が問題でした。そして、すべての人の利益のために、ここに出力例があります

echo ${kiskasys[1]}

#output would look like this:

101 greenbrook

基本的に特殊なエスケープ文字等はありません。

4

1 に答える 1

4

それだけの価値はありますが、あなたの問題を再現することはできません。と をスペースのあるディレクトリに設定localpathした場合:remotepath

localpath="/home/lars/tmp/so/dir1/a directory"
remotepath="/home/lars/tmp/so/dir2/a directory"

次に、コマンドを実行しますrsync(私の環境用に少し変更されています):

rsync -rlptvz -s "$localpath/" -e "ssh" "localhost:$remotepath/"

それはただ働く。の内容は次のdir1とおりです。

dir1/a directory/file1
dir1/a directory/file3
dir1/a directory/file2

rsync を実行すると、dir2次のようになります。

dir2/a directory/file1
dir2/a directory/file3
dir2/a directory/file2

上記のエラーが発生する特定のコマンド ラインを表示できますか? おそらく、-xフラグを指定してスクリプトを実行し、どのように設定されているかlocalpathを正確に示しremotepathます。

于 2012-08-10T21:37:26.340 に答える