我正在编写一个脚本,用于从远程服务器同步已完成的种子,并记住已经同步的文件/文件夹。但是带引号或日文字母的文件名会造成一些麻烦,因此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")
}
答案 0 :(得分:1)
终于搞定了。现在它可以处理像test"!'試みる.ext
这样的字符串。我现在使用ssh和tar,但也应该使用rsync。
sync {
item=${1//\"/\\\"}
ssh -n -c arcfour $server tar -C \"$remotedir\" -c -- \"$item\" | tar x 2>/dev/null
}