旧的rsync和文件名中的空格

源目录是这样确定的:

SHOW=${PWD##*/} SRC=wells@server.com:"/mnt/bigfish/video/TV/${SHOW}/" 

所以它出现如下所示:

 wells@server.com:/mnt/bigfish/video/TV/The Name Of the Show With Spaces/ 

然后试图像这样运行rsync

 rsync -avz -e ssh "${SRC}" . 

但它告诉我“/ mnt / bigfish / video / TV /”不是目录“,”/ mnt / bigfish / video / TV / Name“不是一个目录等,因为很多空格分隔的单词是在源目录的名称。

我怎样才能纠正这个令人讨厌的问题呢?

更新我在OS 10.6上运行这个,我结束了stringreplace空格,如下所示:

 SRC=wells@kittenfactory.com:"/mnt/bigfish/video/TV/${SHOW// /\ }/" 

从rsync手册 :

-s,–protect-args
此选项将所有文件名和大多数选项发送到远程rsync,而不允许远程shell解释它们。 这意味着空格不会被分割,并且任何非通配符特殊字符都不会被翻译(例如〜,$,;,&等)。 通配符在远程主机上通过rsync(而不是shell)进行扩展。

由于你的问题是专用于OS X,根据苹果的rsync手册,你可以使用简单的引号或通配符来完成这个?

 rsync -av host:'file\ name\ with\ spaces' /dest rsync -av host:file?name?with?spaces /dest 

只需要做到这一点,使用简单的引号完美的作品:

 rsync -r --partial --progress --exclude=".cvs" --exclude=".svn" --exclude=".git" --rsh=ssh root@datakeep.local:'/volume1/devel/__To\ SORT/___XXXXX\ Saves\ 2011-04' ./Saves2011 

这工作:

 rsync -avz -e ssh "wells@server.com:\"/mnt/bigfish/video/TV/${SHOW}/\"" 

所以设置:

 SRC=wells@server.com:\"/mnt/bigfish/video/TV/${SHOW}/\" 

至少,在Debian上它的功能就像一个魅力,没有OS 10可以在这里测试。

如果您正在处理脚本中的参数,则可以在OSX上执行此操作:

 ESCAPED_SRC="$(echo "$SRC" | tr ' ' '\\ ')" ESCAPED_DEST="$(echo "$DEST" | tr ' ' '\\ ')" rsync -ravP "$ESCAPED_SRC" "$ESCAPED_DEST"