ubuntu 脚本仅保留每个文件夹的最新文件并删除其他所有内容

ubuntu 脚本仅保留每个文件夹的最新文件并删除其他所有内容

我们有一个脚本,它每小时进行一次备份并将其存储在以今天的日期创建的文件夹中。

#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

(未经测试,因此请勿在未经过测试的情况下将宝贵的数据用于此)

相关内容