我正在編寫一個腳本,用於從遠程服務器同步已完成的種子並記住已經同步的文件/文件夾。但是帶有引號或日文字母的文件名引起了一些麻煩,所以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/"
工作:
- 括號
- 空格
- 日本信
不工作:
- 報價
例如$1
爲test'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")
}