基于unlink 和黑白名单实现删除脚本(日志清理、历史备份清理)

本文介绍了一个Bash脚本,它使用unlink命令删除指定目录下的文件,通过黑白名单机制确保只有符合规则的文件才会被删除,增强了文件删除过程的安全性。
摘要由CSDN通过智能技术生成

零 摘要

rm 过于强大,当使用root 用运行删除脚本时,总是担心误删除,本脚本改用unlink 命令删除单文件,使用黑白名单限制删除文件所在目录,只有被删除文件不在黑名单目录下且同时在白名单目录下才能删除

一 脚本

#!/bin/bash

# 时间格式化,如 20211216120101
DATE="`date +%Y%m%d%H%M%S`"
#DATE="`date +%Y%m%d`"

# 备份app 名称
# 需根据实际需要修改
APP_NAME="devopsapp"

# 文件名称过滤词,正则匹配
# 需根据实际需要修改
#FILE_NAME_MATCH_KEY_WORD="'*'"

# 备份文件目录,待删除文件所在的目录
# 需根据实际需要修改
DIR_BACKUP="/data/backup/${APP_NAME}"

# 存放待删除文件名称,删除操作日志
DIR_LOG="${DIR_BACKUP}/logs"

# 存放删除操作日志
DELETE_FILE_LOG="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.log"

#存放待删除文件清单
DELETE_FILE_LIST="${DIR_LOG}/${APP_NAME}deletefile.${DATE}.list"


#黑名单 ,以黑名单开头的文件 均不能删除
BLACK_LIST=("/root" "/bin" "/dev" "/etc" "/lib" "/lib64" "/media" "/mnt" "/opt" "/proc" "/root" "/run" "/sbin" "/srv" "/sys" "/usr" "/var")


#白名单,只有白名单开头的文件才能删除
# 需根据实际需要修改
WHITE_LIST=("/testdir" "/data/backup")

# 文件保留天数
# 需根据实际需要修改
DAY=8

# 待删除文件名称正则匹配

echo -e "\n----------------- $(date +%F\ %T) Start -----------------"

## 若日志目录不存在则新建
test -d ${DIR_LOG} || mkdir -p ${DIR_LOG}

echo -e "\n================= $(date +%F\ %T) Start =================" >> ${DELETE_FILE_LOG}

# 查找待删除文件,并存入DELETE_FILE_LIST
# '*' 根据需要修改 正则匹配 
find ${DIR_BACKUP} -type f -mtime +${DAY} -iname  'mysql*' >> ${DELETE_FILE_LIST}
#find ${DIR_BACKUP} -type f -mtime +${DAY} |  grep  ${FILE_NAME_MATCH_KEY_WORD} >> ${DELETE_FILE_LIST}

# 遍历待删文件清单 

while read rows
do
    echo ${rows} waiting to delete >>  ${DELETE_FILE_LOG}
    # 如果文件名是/ , 直接退出脚本
    # /* 通过黑白名单 过滤
    if [[ ${rows} == "/" ]]; then
       echo ${rows} illeagal, refuse to delete,please check you script >> ${DELETE_FILE_LOG}
       break;
    else
       # 黑名单判断
       for blackListElement in "${BLACK_LIST[@]}"
       do
           if [[ ${rows} == ${blackListElement}* ]];then
     	      echo ${rows} in blacklist ${blackListElement},refuse to delete this file >> ${DELETE_FILE_LOG} 
              BLACK_LIST_FLAG="YES"
              break
           else
              BLACK_LIST_FLAG="NOT"
           fi
       done #结束黑名单判断
       #白名单 判断
       for whileListElement in "${WHITE_LIST[@]}"
       do
           if [[ ${rows} == ${whileListElement}* ]];then
                 WHITE_LIST_FLAG="YES"
                 break
           else
                  WHITE_LIST_FLAG="NOT"
           fi
       done # 结束白名单循环

     fi  # 根目录判断

     echo  ${row} BLACK_LIST_FLAG IS ${BLACK_LIST_FLAG} >> ${DELETE_FILE_LOG}  
     echo  ${row} WHITE_LIST_FLAG IS ${WHITE_LIST_FLAG} >> ${DELETE_FILE_LOG}  

      if [[ ${BLACK_LIST_FLAG} == "NOT" ]] && [[ ${WHITE_LIST_FLAG} == "YES" ]];then
	   # 执行删除操作
           unlink ${rows} && echo  ${rows} delete success >> ${DELETE_FILE_LOG}
           echo  ${rows} delete
      fi
           

done < ${DELETE_FILE_LIST}

echo -e "\n----------------- $(date +%F\ %T) END -----------------"

echo -e "\n================= $(date +%F\ %T) END =================" >> ${DELETE_FILE_LOG}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值