【问题标题】:Using white spaces in an rsync file path excecuted in a batch file在批处理文件中执行的 rsync 文件路径中使用空格
【发布时间】:2012-08-21 16:20:25
【问题描述】:

所以我使用rsync 来备份一些常用目录,使用批处理脚本和 Windows 调度程序,如下所示:

rsync.bat

@echo off

C:
chdir C:\Cygwin\bin

bash --login -i -c %1

我正在使用 Windows 调度程序定期运行此批处理脚本,效果很好 - 直到我在文件路径中添加空格。这是我在批处理文件快捷方式上使用的目标路径的示例:

目标:C:\Cygwin\scripts\rsync.bat "rsync -vruh /cygdrive/t/uploads /cygdrive/d/Backups"

效果很好。这是带空格的那个:

目标:C:\Cygwin\scripts\rsync.bat "rsync -vruh '/cygdrive/c/Users/username/My Documents' /cygdrive/d/Backups"

注意第一个路径上的单引号带有空格。我一生都无法弄清楚为什么这不起作用 - 我尝试使用 -s 开关来转义反斜杠,过去一些研究解决了这个问题,但是唉,那并没有工作。有人知道如何让它工作吗?

【问题讨论】:

    标签: path whitespace rsync spaces


    【解决方案1】:

    空格的问题是在argv 处理完成以解释命令行。与任何其他 unix 应用程序一样,您必须在命令行上以某种方式转义空格,否则它们将用于分隔参数。

    例如:

    rsync -av host:'"a long filename"' /tmp/
    rsync -av host:'a\ long\ filename' /tmp/
    rsync -av host:a\\\ long\\\ filename /tmp/
    

    或者使用“?”只要没有其他匹配的文件名而不是带空格的文件名,就可以代替空格(因为“?”匹配任何字符):

    rsync -av host:a?long?filename /tmp/
    

    只要您知道命令行上的远程文件名由远程 shell 解释,那么一切正常。

    http://rsync.samba.org/FAQ.html#9

    【讨论】:

    • 感谢您的回复。这就是我过去最终要解决的问题。 +1
    • 这个答案实际上是从那里复制和粘贴的 - rsync.samba.org/FAQ.html#9
    • 答案是正确的,但应注意空格必须转义两次,一次用于本地shell 解释命令,一次用于远程机器再次解释命令。
    【解决方案2】:

    我在 Windows 7 下的批处理文件中使用 rsync 时遇到了类似的问题。批处理文件代码是:

    rsync -hrtv --modify-window=3602 /cygdrive/c/Users/gavin/My Documents/ArmA Other Profiles/TheProf/ /cygdrive/h/Hobies/ARMA_BU/
    

    这可能只是 Windows 7 的问题,但文件夹 gavin/My Documents 应该只是 gavin/Documents。此外,还需要单引号来克服空格,例如:

    rsync -hrtv --modify-window=3602 '/cygdrive/c/Users/gavin/Documents/ArmA Other Profiles/TheProf/' /cygdrive/h/Hobies/ARMA_BU/
    

    【讨论】:

      【解决方案3】:

      特殊情况: 如果路径中有空格和通配符(*),上述解决方案似乎不起作用(rsync: link_stat...failed

      只有用引号括起来的空格似乎有效。

      /cygdrive/C/My" "Folder" "/My" "File*.txt
      

      【讨论】:

        【解决方案4】:

        上面的“仅用引号括起来的空格似乎有效”是帮助我制作包含大量空格的 OneDrive 目录副本的唯一解决方案。这是我必须使用的语法的长短篇幅

        rsync -avz --progress --exclude-from %excludefile% /cygdrive/C/Users/username/OneDrive" "-" "company1" "company2," "Inc/Documents/* /cygdrive/x/msi /MyDocuments/ --log-file=rsync-MyDocs.LOG

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-31
          • 2021-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多