【问题标题】:old rsync and spaces in filenames文件名中的旧 rsync 和空格
【发布时间】:2011-03-20 21:15:21
【问题描述】:

源目录是这样确定的:

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/The" 不是一个目录,""/mnt/bigfish/video/TV/Name" 不是一个目录,等等,不管有多少空间- 分隔的单词位于源目录的名称中。

我该如何解决这个非常烦人的问题?

更新我在 OS 10.6 上运行它,我最终用转义空格替换字符串,如下所示:

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

【问题讨论】:

    标签: linux macos bash rsync


    【解决方案1】:

    来自rsync manual

    -s, --protect-args
    此选项将所有文件名和大多数选项发送到 偏僻的 rsync 不允许远程 shell 解释它们。 这 意味着空格在名称中不分开,并且任何 非通配符 不翻译特殊字符(如~、$、;、&、 等等。)。通配符在远程主机上通过 rsync (而不是 shell 这样做)。

    【讨论】:

    【解决方案2】:

    这行得通:

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

    这样设置:

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

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

    【讨论】:

    • 是的,-s 和手动转义是推荐的解决方法。从手册中:“如果您需要传输包含空格的文件名,您可以指定 --protect-args (-s) 选项,或者您需要以远程 shell 可以理解的方式转义空格。”
    【解决方案3】:

    由于您的问题专门针对 OS X,根据 Apple rsync manual,您可以使用简单引号或通配符 ? 来完成此操作:

    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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-08
        • 2020-09-08
        • 1970-01-01
        • 2014-08-20
        • 2010-12-07
        • 2012-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多