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

Terminal cp won't copy path folders with special characters within for loop?

我正在开发一个 bash 脚本,用于从时间机器备份中递归复制过时的文件夹,然后进行重复数据删除。正如预期的那样,cp(复制)命令在循环外和直接在终端(-R 和 -L 标志设置)中使用时正确复制预期的 'foldertocopy' - 但在脚本循环内时则不然,这仅复制内容。这是由于循环中源路径中的特殊字符造成的吗?转义源路径中的 ' s ' 失败,终端指示没有 cp 源。

该脚本将包含时间机器日期的文本文件 ($source) 读取到数组 (DATES) 中,然后将目标文件夹复制到新目标。新的目标路径是根据用户输入构建的(即 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 序列是可行的,尽管在这种情况下没有必要。

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