运行 ubuntu 16.04
更新:我通过双引号变量来获取错误消息:
cp -ru "$line" "$destname"
但它仍然没有复制任何内容。在echo $?
上面的行之后添加后,我得到了 0。
cp
用ls -l
列表替换目录的内容。
代码:
[ $# -eq 0 ] && { echo "Usage: $0 m/d/yyyy"; exit 1; }
DestDir=/media/WD_NAS_LEW/grsync
find Documents -type f -newermt $1 > mybackup.log
awk 'BEGIN{FS=OFS="/"}{NF--; print}' mybackup.log | while read line
do
destname=$DestDir/$line
cp -ru $line $destname
done
#rm mybackup.log
echo Done
脚本输出——并且文件没有被复制,没有以下错误:
$ ./mybackup.sh 8/20/2018
cp: target 'Card/Documents' is not a directory
cp: target 'Lessons' is not a directory
cp: target 'Lessons' is not a directory
cp: target 'Letters' is not a directory
cp: target 'Asia' is not a directory
cp: target 'Procedures' is not a directory
Done
输入:mybackup.log 的内容(带有文件名的完整路径):
Documents/Phone/Phone Main Memory Card/Documents/misc.doc
Documents/Lew/PFinc/Bills N Balances.ods
Documents/Lew/Trading/Market Review.odt
Documents/Lew/Trading/Trade Tools.ods
Documents/Lew/Trading/Studies & Lessons/Summary Technical Analysis.odt
Documents/Lew/Trading/Studies & Lessons/Paper calendars and diagonals.odt
Documents/Lew/Trading/Paper Trades.ods
Documents/Lew/Trading/DVL/thinkscript/Mark_Volume_SpikeSTUDY.ts
Documents/Lew/General/Essays & Letters/0 RFR.odt
Documents/Lew/General/Long Fist et al Asia/Long Tai Chi.odt
Documents/Lew/General/Technology/Backup Procedures/find files since X for manual backup.png
Documents/Kids/Carey/Carey August 2018.odt
Documents/Kids/Renee/birth certif and social Stella.pdf
Documents/Kids/Renee/Noah/Noah Confucius tenets.odt
awk 输出(仅源目录,无尾随“/”;目标驱动器是 Western Digital mybook NAS):
/media/WD_NAS_LEW/grsync/Documents/Phone/Phone Main Memory Card/Documents
/media/WD_NAS_LEW/grsync/Documents/Lew/PFinc
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/Studies & Lessons
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/Studies & Lessons
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading
/media/WD_NAS_LEW/grsync/Documents/Lew/Trading/DVL/thinkscript
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Essays & Letters
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Long Fist et al Asia
/media/WD_NAS_LEW/grsync/Documents/Lew/General/Technology/Backup Procedures
/media/WD_NAS_LEW/grsync/Documents/Kids/Carey
/media/WD_NAS_LEW/grsync/Documents/Kids/Renee
/media/WD_NAS_LEW/grsync/Documents/Kids/Renee/Noah
它似乎正在更改字段分隔符。我需要删除目录名称中的空格吗,或者有办法保留它们吗?
答案1
如果文件名中有空格,大多数命令会将其解释为两个文件名。例如,如果您有一个名为“my file”的文件,并尝试将其复制到 /tmp,如下所示:
cp my file /tmp
cp 命令将查找两个文件(称为my
和file
——如果它们不存在则将失败)。
为了解决这个问题,请在文件名周围加上引号:
cp "my file" /tmp
你需要在脚本中做同样的事情
cp -ru "$line" "$destname"
(bash 仍会扩展双引号内的变量名,但不会扩展单引号内的变量名)
我还没有完全检查你的脚本——可能还有其他地方需要引用变量名。
顺便说一句——关于使用 rsync 的评论很多。一旦你习惯了它,它就是一种更好的备份方式!