代码之家  ›  专栏  ›  技术社区  ›  Stix

终端cp不会在for循环中复制具有特殊字符的路径文件夹?

  •  1
  • Stix  · 技术社区  · 8 年前

    我正在开发一个bash脚本,用于递归地从Time Machine备份中复制带日期的文件夹,然后进行重复数据消除。正如预期的那样,当在循环外部使用并且直接在终端中使用时(设置了-R和-L标志),cp(copy)命令会正确复制预期的“foldertocopy”,但当放置在脚本的循环中时,不会正确复制,脚本的循环只复制内容。这是由于循环内源路径中的特殊字符引起的吗?转义源路径中的“s”失败,终端指示没有cp的源。

    该脚本将包含时间机器日期的文本文件($source)读入数组(日期),然后将预期文件夹复制到新的目标。新的目的地路径是根据用户输入构建的(即,read-p“destination”dest)。

    IFS=$'\n' read -d '' -r -a DATES < $source
    for date in "${DATES[@]}"
    do
        cp -RL /Volumes/Time\ Machine\ Backups/Backups.backupdb/Stix\'s’s\ MacBook\ Pro/$date/Macintosh\ HD/Users/foldertocopy /$dest/$date/$name
    done
    

    当cp在循环中时,将复制foldertocopy内容,就像没有设置-R标志一样。

    我应该做些什么来复制目录而不是内容?

    更新: 在路径中使用unicode序列是可行的,尽管在这种情况下没有必要。

    1 回复  |  直到 8 年前
        1
  •  1
  •   janos slartidan    8 年前

    我看到这些变量在 cp 命令参数:

    • $date
    • $dest
    • $name

    如果不包含在双引号中,并且包含空格或其他特殊字符,则会中断命令。

    这个 内容提供商 这样编写命令更安全、更简单:

    cp -RL "/Volumes/Time Machine Backups/Backups.backupdb/Stix's’s MacBook Pro/$date/Macintosh HD/Users/foldertocopy" "/$dest/$date/$name"
    

    此外,我对该文件夹名称有疑问:

    /Volumes/Time Machine Backups/Backups.backupdb/Stix's’s MacBook Pro
    

    你确定你有吗 's’s 在那里?验证名称是否正确。 (输出是什么 ls -d "/Volumes/Time Machine Backups/Backups.backupdb/Stix"* ?)

    推荐文章