我有基本的.sh脚本来进行夜间备份。整个代码是:
#!/bin/bash
DATE=`date +%Y%m%d`
tar czfP /var/www/backup/$DATE.tar.gz `find /var/www/web -type d | grep -E '/var/www/web/web[0-9]+/web' | grep -v 'web1'`
这使得我所有网站的$DATE.tar.gz
文件排除" web1"。它工作正常,直到今天。
当我在控制台中手动执行此脚本(不使用cron)时,我会看到任何警告("No such file or directory"
,通常是当dirname / filename在名称中有空格时)。没关系,我无能为力,客户自己创建文件。我认为这些文件没有备份。
但是今天,脚本运行以1/3结束,错误消息为Exiting with failure status due to previous errors
。我不知道剧本在哪里发生故障,所以......
有没有办法写"路径/文件名"最后一个错误文件(导致"Exiting with failure status due to previous errors"
)进入日志?如果可能,我们可以排除"没有这样的文件或目录"错误,他们将每天在那里,没有机会修复文件名。
由于
PS:
我读过这条错误信息可能是由无效的用户权限引起的。如果是这样,我可以检查权限,但我需要知道脚本失败的位置。到目前为止它确实正常工作,3年前cca,所有文件都是由CMS(同一个www用户)创建的,没有任何手动上传。
答案 0 :(得分:0)
来自find
的输出由shell标记化,这意味着其中包含空格的任何文件名将被分解为多个部分(多个表观文件名,其中没有一个可能存在)。基本上,不要使用反引号(或更一般地command substitutions),其中输出是文件名列表。
根据您的具体要求,解决方法可能非常简单。
tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web
将web0
和web2
归档到web9
。如果这就是您所需要的,那么您已经完成了。您可以扩展到单位和双位而不会丢失易读性:
tar czfP /var/www/backup/$DATE.tar.gz /var/www/web/www[02-9]/web /var/www/web/www[02-9][0-9]/web
等(如果你的shell是Bash,这可以用大括号缩写)但是对于多个数字或更复杂的目录层次结构,可能这不是你真正想要的。
更一般地说,您可能想要探索GNU --exclude
的{{1}}选项。
更一般地说,如果你有GNU tar
,你可以使它产生输出,其中路径名由空字节而不是换行符分隔。这使得输出明确(null是唯一一个永远不会出现在文件名中的字符)并且健壮。
find
find /var/www/web/www[0-9]/web -type d -path web1/web -prune -o -print0 |
xargs -r0 tar czfP /var/www/backup/"$DATE".tar.gz
选项和相应的-print0
选项是GNU扩展。没有它们,几乎不可能强有力地处理任意文件名,所以我建议你安装GNU版本,如果你被困在一个没有开箱即用的架构上。
至于捕获xargs -0
错误,我建议您将错误输出重定向到文件,以便您可以随意查看。