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

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

我正在为使用 DataFlame 网络托管的客户创建一个简单的数据库备份解决方案。

网络托管帐户提供对 cron 的访问权限,但不提供对 shell 的访问权限。

我有一个创建定期备份的数据库备份脚本,我想自动删除那些超过 N 天的备份。

我尝试使用

find -v $backup_dir -mtime +$keep_days -name "*db.tar.gz" -delete

但是执行脚本的用户没有运行的权限find

您能建议如何在不使用find命令的情况下实现这一点吗?

答案1

一个 hack-ish 想法可能是将自纪元以来的天数(即date +%s除以 86400)乘以 $keep_days 后的结果合并到文件名称中。

在这种情况下,您不必删除较旧的备份文件。一旦自纪元以来的天数模 $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 天后被覆盖。

答案2

这是我根据@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

答案3

您确定您无权访问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列出目录,按时间排序(最新文件在前)。指示sed "1,5d"sed输入中删除前 5 行(对应于我们的 5 个最新文件)。最后,xargs合并列表并指示rm删除它们。

答案4

您说您没有 shell 访问权限。假设您指的是没有交互式 shell 访问权限,则此 Bash 脚本会在 3 天内递归删除数据库 tarball(计算方法是取当前日期并减去 3 天的秒数,然后将其与 tarball 的 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

相关内容