这个备份脚本有什么问题?

这个备份脚本有什么问题?

运行 ubuntu 16.04

更新:我通过双引号变量来获取错误消息:

cp -ru "$line" "$destname"

但它仍然没有复制任何内容。在echo $?上面的行之后添加后,我得到了 0。

cpls -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 命令将查找两个文件(称为myfile——如果它们不存在则将失败)。

为了解决这个问题,请在文件名周围加上引号:

cp "my file" /tmp

你需要在脚本中做同样的事情

cp -ru "$line" "$destname"

(bash 仍会扩展双引号内的变量名,但不会扩展单引号内的变量名)

我还没有完全检查你的脚本——可能还有其他地方需要引用变量名。

顺便说一句——关于使用 rsync 的评论很多。一旦你习惯了它,它就是一种更好的备份方式!

相关内容