零 摘要
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}