2014-04-05 113 views
3

我正在編寫一個腳本,用於從遠程服務器同步已完成的種子並記住已經同步的文件/文件夾。但是帶有引號或日文字母的文件名引起了一些麻煩,所以rsync現在必須運行兩次。rsync:帶空格,引號和日文字母的文件名

rsync -aP ovh:"$src/$(printf "%q" "$1")" "$dst/"

工作:

  • 括號
  • 空格
  • 報價

不工作:

  • 日本信

每一個日文字母將被轉換成類似?\#211\#215島\#227?\。由於我使用OS X,我也試過--iconv=utf-8-mac,utf-8 - 沒有成功。

rsync -aP ovh:"'$src/${1/\'/\\'}'" "$dst/"

工作:

  • 括號
  • 空格
  • 日本信

不工作:

  • 報價

例如$1test's file,字符串發送到服務器變得"'/data/rtorrent/complete/test\'s file'"
錯誤消息:zsh:1: unmatched '

似乎是一個單引號的文本不工作中逃脫。但是,如果除去外部單引號,rsync會將空白解釋爲另一個文件的分隔符。

我想也許它會幫助將每個單一字符轉換爲Unicode(如\u1337)並將此字符串發送到服務器,但沒有找到一種方法來做到這一點。相反,只是無盡的腳本。

sed也沒有幫助 - 方式太多的工作,以逃避一切手動。這個腳本應該工作可靠,我不想每隔一段時間檢查一次,如果我覆蓋了可能需要轉義的每種可能性。

任何想法如何將兩個命令合併爲一個?

編輯:我的臨時解決辦法是這樣的:

sync() { 
    # 1. escape quotes/2. escape kana 
    rsync -aP ovh:"$src/$(printf "%q" "$1")" "$dst/" >& /dev/null && success "$1" || \ 
(rsync -aP ovh:"'$src/${1/\'/\\'}'" "$dst/"  >& /dev/null && success "$1" || unlock "$1") 
} 

回答

1

終於得到它的工作。現在它可以處理像test"!'試みる.ext這樣的字符串。我現在使用ssh和tar,但也應該使用rsync。

sync { 
    item=${1//\"/\\\"} 
    ssh -n -c arcfour $server tar -C \"$remotedir\" -c -- \"$item\" | tar x 2>/dev/null 
} 
相關問題