终端 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"*
的输出是什么?)
我正在开发一个 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"*
的输出是什么?)