我正在为DataFlame上的Web托pipe客户端创build一个简单的数据库备份解决scheme。
networking托pipe帐户提供了访问cron,但不是一个shell。
我有一个数据库备份脚本创build定期备份,我想自动删除那些超过N天。
我试图使用
find -v $backup_dir -mtime +$keep_days -name "*db.tar.gz" -delete
但是执行该脚本的用户不具有运行find权限。
你可以build议如何实现这个,而不使用find命令?
一个黑客的想法可能是把你自$ keep_days以来的时代(即date +%s除以86400)modjoin到文件名中。
在这种情况下,您不必删除旧的备份文件。 一旦天数模数$ keep_days数字再次出现,您将覆盖旧数据。
像这样的东西:
#!/bin/bash keepdays=60 epochdays=$(expr $(date +%s) / 86400) backupindx=$(expr $epochdays % $keepdays) backupfile=/path/to/backup/file.${backupindx}.db.tgz
因此,今天2012年3月27日,您将拥有备份文件file.7.db.tgz,将在60天内被覆盖。
根据@cjc的回答,我最终使用了一个简短版本的脚本。
#!/bin/sh # Script to backup ... database. # # A rolling backup is used. The size of period backed up is configurable. # The period size is expressed in terms of an arbitary time unit "timeunit". # # Files are saved with format: # <date>-...-<index within period>.sql.tar.gz # # Author: Calum J. Eadie ### Configuration backup_dir=/home/..../backups # The size of a timeunit. Eg. 300 for a timeunit that is 5 minutes long. seconds_per_timeunit=$(expr 60 \* 60 \* 6) # 6 hours # The size of backup period in timeunits. keep_timeunits=$(expr 4 \* 30) # 30 days ### Script # Form files names date_string=`date +%Y-%m-%d-%H-%M-%S` # Time since unix epoch in timeunits epoch_timeunits=$(expr $(date +%s) / $seconds_per_timeunit) # Index unique to timeperiod. backup_index=$(expr $epoch_timeunits % $keep_timeunits) raw=$backup_dir/$date_string-...-$backup_index.sql compressed=$raw.tar.gz # Remove old backup rm -v $backup_dir/*-...-$backup_index.sql.tar.gz # Create new backups mysqldump -u ... -p... --databases ... --add-drop-database --add-drop-table > $raw tar czf $compressed $raw rm $raw
你确定你没有find ? 还是只是不在路上? 尝试运行它作为/usr/bin/find ,看看是否适合你。
如果这样做不起作用,那么你处在一个艰难的地步。 如果find不可用,并且您无法访问shell,那么您将不知道可用的内容。 如果Perl可用,执行上述任务将是一个相当简单的perl脚本。 只用shell。 。 。 我可能会尝试这样的事情:
ls -t /backup_dir/*.db.tar.gz | sed "1,5d" | xargs rm -f
其中5是你想保留的天数(根据需要修改)。
简短的解释: ls -t列出目录,按时间sorting(最新的第一个)。 sed "1,5d"告诉sed从input中移除前5行(对应于我们的5个最新文件)。 最后, xargs结合了列表并告诉rm删除它们。
你说你没有shell访问。 假设你的意思是没有交互式shell访问,这个Bash脚本在3天之内recursion地删除db tarball(通过获取当前date和减去3天的秒数并且将其与压缩包的mod时间比较来计算)。
#!/bin/bash for linkname; do if [[ -d "$linkname" ]]; then "$0" "$linkname" elif [[ "$linkname" =~ '^.*db\.tar\.gz$' ]]; then if (( $(stat --format=%y "$linkname") < ( $(date +%s) - 259200) )); then rm -f "$linkname" fi fi fi