rsync:带有空格,引号和日文字母的文件名

时间:2014-04-05 17:23:25

标签: bash unicode rsync double-quotes

我正在编写一个脚本,用于从远程服务器同步已完成的种子,并记住已经同步的文件/文件夹。但是带引号或日文字母的文件名会造成一些麻烦,因此rsync目前必须运行两次。

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

工作:

  • 括号
  • 空格
  • 报价

不工作:

  • japanese letters

每个日语字母都会转换为?\#211\#215島\#227?\。由于我使用OS X,我也尝试了--iconv=utf-8-mac,utf-8 - 但没有成功。

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

工作:

  • 括号
  • 空格
  • japanese letters

不工作:

  • 报价

例如$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 个答案:

答案 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
}