在web主机中找不到`find`命令,如何使用其他命令实现基于修改时间的删除?

我正在为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