我们有一个脚本,它每小时进行一次备份并将其存储在以今天的日期创建的文件夹中。
#CRONJOB TO BACKUP DB HOURLY
DAY=$(/bin/date +%d%m%Y)
TIME=$(/bin/date +%H%M%S)
if [ ! -d /home/user/Desktop/cron_database_hourly/$DAY ]; then
sudo mkdir /home/user/Desktop/cron_database_hourly/$DAY
fi
sudo chmod -R 755 //home/user/Desktop/cron_database_hourly/$DAY
cd /home/user/Desktop/cron_database_hourly/$DAY/
mysqldump -u root -p'password' current > current_$TIME.sql
zip current_$TIME.zip current_$TIME.sql > /dev/null 2>&1
sudo rm current_$TIME.sql
因此文件夹内将有 24 个文件20072018名字将会像current_000001.zip
现在我们的空间不够了,所以决定每天只保留一个备份,并删除所有其他备份。
我尝试了以下脚本,它删除了除第 23 小时备份之外的所有内容。
sudo find /home/user/Desktop/cron_database_hourly/* -type f \( -name "*_00*.zip" -o -name "*_01*.zip" -o -name "*_02*.zip" -o -name "*_03*.zip" -o -name "*_04*.zip" -o -name "*_05*.zip" -o -name "*_06*.zip" -o -name "*_07*.zip" -o -name "*_08*.zip" -o -name "*_09*.zip" -o -name "*_10*.zip" -o -name "*_11*.zip" -o -name "*_12*.zip" -o -name "*_13*.zip" -o -name "*_14*.zip" -o -name "*_15*.zip" -o -name "*_16*.zip" -o -name "*_17*.zip" -o -name "*_18*.zip" -o -name "*_19*.zip" -o -name "*_20*.zip" -o -name "*_21*.zip" -o -name "*_22*.zip" \) -mtime +30 -delete
但问题是,有些天 23 号备份不可用,因为服务器已关闭。我该如何修改上述脚本,以便它检查每个日期的最新备份文件 只保留该文件并删除其他所有内容?
答案1
您可以使用:
ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \
while read -r f; do rm "$f"; done
这将按字典顺序查找目录中的所有存档文件,然后使用head
列出除最后一个 ( -n -1
) 之外的所有文件,并循环删除列出的文件while
。
我建议您将其放在最初echo
之前rm
,以便在使用 live 之前查看将执行哪些命令。
答案2
就像是
ls datedir | head -n -1 | xargs rm
(未经测试,因此请勿在未经过测试的情况下将宝贵的数据用于此)