shell脚本实现定时删除,保留最新3份文件

shell脚本实现定时删除,保留最新3份文件
长青最近又开了一台服务器专门用来储存网站源码+数据库
正好写一篇文件记录一下,也给大家一个例子看看

长青这里有两台服务器,A和B,A是运行网站的,B是用来存储数据的
首先呢,现在A服务器把定时备份的数据库和源码每隔1小时发送到B服务器的备份目录中
shell脚本如下:

#!/bin/bash
while true
do
  yuanma=$(ls /www/backup/site/ | tail -1)
  sql=$(ls /www/backup/database/ | tail -1)
  scp /www/backup/site/"$yuanma" ip:/root/haitangw.cc_bak/yuanma/
  scp /www/backup/database/"$sql" ip:/root/haitangw.cc_bak/sql/
  sleep 1h
done

首先使用ls命令列出指定目录下的所有文件然后,通过tail命令选择最新的一个文件进行复制。最后,scp命令用于将该文件从本地主机发送到远程主机的根目录中。在这个例子中,我们使用了变量yuanma来存储最新文件的文件名,以便在scp命令中使用。sleep命令用于休眠一段时间,单位为小时,因此在每次循环结束后等待1小时,然后重复同样的复制过程。

接下来就是编写B服务器中定时保留最新3份文件的脚本

#!/bin/bash
while true
do
  # 获取目录下所有log文件,按照修改时间排序
  num1=($(ls -t /root/haitangw.cc_bak/yuanma/))
  num2=($(ls -t /root/haitangw.cc_bak/sql/))
  
  # 计算需要删除的文件数量
  yuanma=$((${#num1[@]}-3))
  sql=$((${#num2[@]}-3))

  # 删除旧文件
  if [[ $yuanma -gt 0 ]]; then
    for (( i=0; i<$yuanma; i++ ))
    do
      rm "${num1[$i]}"
    done
  fi

  # 删除旧文件
 if [[ $sql -gt 0 ]]; then
    for (( i=0; i<$sql; i++ ))
    do
      rm "${num2[$i]}"
    done
  fi

  sleep 1h
done

在每个循环中,使用ls命令列出指定目录下所有的文件,并按照修改时间从新到旧排序。然后,通过计算需要删除的文件数量(即文件总数减去要保留的文件数),对旧文件进行删除。根据这个计算结果,使用一个for循环来遍历列表,删除前面的文件。
最后,使用sleep命令等待一小时,然后重复同样的操作。请注意,如果没有足够的旧文件需要删除,for循环将不会被执行。

上面用的while+sleep做得定时,大家启动的时候可以加个&符号后台运行
但是也有缺点,这种容易挂掉,大家可以换成crontab定时任务比较好

猜你喜欢

转载自blog.csdn.net/qq_42716761/article/details/129948367
今日推荐