【问题标题】:Dealing with spaces in rsync path arguments处理 rsync 路径参数中的空格
【发布时间】:2014-09-29 12:37:25
【问题描述】:

所以我目前正在尝试编写一些小脚本,让我能够管理我在多台 OS X 机器上克隆的 iTunes 库。

基本的想法是我有一个 NAS 保存库的副本,用作中间“主副本”,因为保存实际使用的副本的机器并非始终可用。如果我想用机器 A 的较新版本更新机器 B 上的旧副本,我会根据机器 A 的当前状态更新 NAS 副本,然后可能在以后从更新的 NAS 副本更新机器 B。

脚本文件位于 NAS 上与 iTunes 目录相同的文件夹中。由于我通过 AFP 将 NAS 安装为卷,因此我只需打开一个包含脚本的目录的 Finder 窗口,然后将要使用的脚本拖放到终端窗口以便于执行。

这是我对“从本地副本更新 NAS”脚本的尝试:

rsync -avz --compress-level 1 --exclude 'Mobile Applications/*.ipa' --delete --delay-updates -n "$(echo $HOME | sed 's/ /\\ /g')/Music/iTunes" "$(dirname $0 | sed 's/ /\\ /g')"

-n 选项当然只用于测试脚本)

由于在我提供rsync 的路径中会有空格,我已经发现我需要以某种方式逃避这些。我也知道在 OS X 上执行此操作的标准方法是在所有空格前加上反斜杠,至少在终端中手动键入路径时是这样。但是上面的代码仍然无法工作——rsync 抱怨它无法更改到我提供的目录,尽管它在错误消息中吐出的路径似乎非常好,并且可以是cd'd,如果您首先删除它周围的双引号:

[...]
building file list ... rsync: change_dir "/Volumes/Macintosh\ HD/Users/Julian/Music" failed: No such file or directory (2)
done
[...]

如果我在脚本本身中删除周围的双引号,rsync 似乎根本不遵守转义的反斜杠,并且仍然将反斜杠后面的空格视为路径分隔符:

[...]
building file list ... rsync: link_stat "/Volumes/Macintosh\" failed: No such file or directory (2)
rsync: change_dir "/Volumes/Macintosh HD/Users/Julian/HD/Users/Julian/Music" failed: No such file or directory (2)
done
[...]

不,我无法通过将 /Volumes/Macintosh\ HD/Users/Julian/Music 缩短为 /Users/Julian/Music 来解决此问题,因为这台机器有多个 HDD 并且 //Volumes/Macintosh\ HD 不是同一个磁盘/分区。所以我需要为这个特定问题找到解决方案。

我现在迷路了。

谁能向我解释我需要更改什么才能让rsync 正确识别路径?

【问题讨论】:

    标签: macos bash shell path rsync


    【解决方案1】:

    在找了this question 之后,我设法开发了一个可行的解决方案:

    localpath=$HOME/Music/iTunes
    remotepath=$(dirname $0)/
    
    rsync -avz \
        --compress-level 1 \
        --exclude 'Mobile Applications/*.ipa' \
        --delete \
        --delay-updates \
        -n \
        "$localpath" \
        "$remotepath"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多