我正在使用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序列,虽然在这种情况下不是必需的。
答案 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"*
的输出是什么?)