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

时间:2017-12-06 06:20:32

标签: bash unicode terminal tmux cp

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

脚本将包含时间机器日期的文本文件($ source)读入数组(DATES),然后将目标文件夹复制到新目标。新的目标路径由用户输入构成(即读取-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 个答案:

答案 0 :(得分:1)

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

  • $date
  • $dest
  • $name

如果没有用双引号括起来,如果它们包含空格或其他特殊字符,则会破坏命令。

cp命令将更安全,更简单地编写如下:

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"*的输出是什么?)