2012-02-01 5 views
0

シェル(/bin/bash)は、forループ内のファイルから読み込まれた変数に一重引用符を追加し、rsyncを失敗させます。シェルは、rsyncが失敗した変数に一重引用符を追加しています

私はrsyncの束をしているシェルスクリプトを持っています。入力ファイルは、次のようになりますループの /home/account/thisサブディレクトリ

次のようになります。IFS=$'\n'なければ

IFS=$'\n' 
for SOURCE_DEST in `cat file_list` 
do 
    rsync -av -e 'ssh -p 2222' [email protected]:$SOURCE_DEST 
done 

、デフォルトでは唯一に$SOURCE_DESTを引き起こし含まれています /home/account/thisの代わり/home/account/this subdirectory

私はIFS=$'\n'でこのスクリプトを実行するときしかし、それは、次のような$SOURCE_DEST周りの単一引用符を置く:奇妙なことに失敗して行うことがrsyncの原因となる'[email protected]:/home/account/this subdirectory'

例:失敗した

rsync --delete-after -av -e 'ssh -p 2222' '[email protected]:/home/account/this subdirectory' 

、と私は必要なの単一引用符なしでこれです:

rsync --delete-after -av -e 'ssh -p 2222' [email protected]:/home/account/this subdirectory 

答えて

1

私は「あなたのために、スペースを含む名前のどれを負いませんするつもりです

while read line 
do 
    line=($line) # split line on its spaces 
    rsync -av -e 'ssh -p 2222' [email protected]:${line[0]} ${line[1]} 
done < file_list 

これはあなたのfile_listのを読み取ります。このような何かについてどのように区切り文字としてスペースを使用して、その再一度に1行ずつ、スペースで分割し、argsとして持っていた1番目と2番目の "単語"を使います。

Johnsywebが指摘しているように、実際にはディレクトリに空きがあり、そのファイルをrsyncに渡したいと思っていた可能性があります。その場合は、私が言うと思います:

while read line 
do 
    rsync -av -e 'ssh -p 2222' "[email protected]:${line// /\ }" 
done < file_list 

私はあなたが前に欠落していた何かもしれないと思うエスケープするためのすべてのスペースを、起こす必要があること。

+1

質問を正しく読んでいれば、 '$ {SOURCE_DEST}'は '/ home/account/thisサブディレクトリ 'にする必要があります。 – Johnsyweb

+0

Hm。あなたは正しいかもしれません - 私は最初にそれについて考えましたが、それをどうやって理解するかは分かりませんでした。もしそうなら、それほど難しいはずがありません。あまりにもそれを解決するために私は更新するつもりです。 – FatalError

+1

はい、SOURCEパスをDESTパスにコピーしているため、スペースが必要です。 –

関連する問題