common_clear.sh

#!/bin/bash########################################################################
#程序名:common_clear.sh
# 作者:曹海涛
# 生成日期:2014-08-29
# 功能:通用文件清除脚本,可对多个指定目录按照磁盘空间、
#       文件保存天数进行清理,并可设置目录扫描深度
# 参数:无
# 修改历史:
# 1、作者:曹海涛
#    日期:2014-09-01
#修改内容:
#          将配置信息独立为单独的配置文件common_clear.conf,并加入配置文件解析函数ImportConf
#          加入定时任务自动配置函数DeployCron
# 2、作者:曹海涛
#    日期:2014-09-02
#修改内容:
#          将日志文件分为三种类型
#          导入配置文件时检查各配置项是否配置正确
#          优化告警信息
#          增加Exit函数,在退出时清理过期日志
#          本版本只对YYYYMMDD的目录进行扫描
################################################################################################################################################
#函数在此定义
########################################################################
########################################################################
# 函 数 名  : InitEnv
# 功能描述  : 初始化脚本
# 输入参数  : 无
# 返 回 值  : 无
# 调用函数  : 无
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function InitEnv
{unalias -a#版本号 VERSION="V1.3_20140902"#暂定的正则表达式REG_EXP="*"#当前时间,UTC时间DATE_NOW=$(date +'%s')#当前日期DATE_DAY=$(date +'%Y%m%d')#主脚本目录绝对路径DIR_INSTALL="$(cd $(dirname $0);pwd)"#脚本名,去.sh后缀SCRIPT_NAME="$(basename $0 .sh)"#配置文件路径FILE_CONF="${DIR_INSTALL}/${SCRIPT_NAME}.conf"#日志文件目录DIR_LOG="${DIR_INSTALL}/logs"#脚本运行信息日志FILE_RUNINFO="${DIR_LOG}/runinfo_${DATE_DAY}.log"#删除文件正常日志FILE_LOG_NORMAL="${DIR_LOG}/clear_normal_${DATE_DAY}.log"#删除文件异常日志FILE_LOG_ERROR="${DIR_LOG}/clear_error_${DATE_DAY}.log"#日志保存天数LOG_KEEP_DAY=30mkdir -p "${DIR_LOG}"
}
################################################################################################################################################
# 函 数 名  : Echo
# 功能描述  : 将传入的日志信息附上时间
# 输入参数  : 日志信息
# 返 回 值  : 时间|日志信息
# 调用函数  : 无
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function Echo
{local msg="$1"local date=$(date +'%Y-%m-%d %H:%M:%S')echo "${date}|${msg}"
}
################################################################################################################################################
# 函 数 名  : Exit
# 功能描述  : 在退出脚本时清理日志
# 输入参数  : 无
# 返 回 值  : 无
# 调用函数  : Echo
# 修改历史      :
#  1.日    期   : 2014年09月02日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function Exit
{local day_del=$(date -d "- ${LOG_KEEP_DAY} day" +'%Y%m%d')for file in runinfo clear_normal clear_errordolocal log="${DIR_LOG}/${file}_${day_del}.log"if [[ -f ${log} ]];thenrm -f "${log}"Echo "delete log ${log}" >> ${FILE_RUNINFO}fidoneexit 0
}
################################################################################################################################################
# 函 数 名  : ImportConf
# 功能描述  : 导入配置文件,当配置文件不存在时退出脚本并写错误日志
# 输入参数  : 无
# 返 回 值  : 无
# 调用函数  : 无
# 修改历史      :
#  1.日    期   : 2014年09月01日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
#  2.日    期   : 2014年09月02日
#    作    者   : 曹海涛
#    修改内容   : 对配置文件的配置项进行检查,当配置项错误时写日志并退出脚本
########################################################################
function ImportConf
{local conf="${FILE_CONF}"if [[ -f "${conf}" ]];thensource "${conf}"elseEcho "config file ${conf} not exist! please check." >> ${FILE_RUNINFO}Exitfiif [[ -z "${DIR_CLEAR}" ]];thenEcho "DIR_CLEAR in ${conf} not configure! please check." >> ${FILE_RUNINFO}Exitfiif [[ -z "${KEEP_TIME_MAX}" ]];thenEcho "KEEP_TIME_MAX in ${conf} not configure! please check." >> ${FILE_RUNINFO}Exitelif ! (( ${KEEP_TIME_MAX}>0 ));thenEcho "KEEP_TIME_MAX in ${conf} not a positive integer! please check." >> ${FILE_RUNINFO}Exitfiif [[ -z "${DISK_SPACE_MIN}" ]];thenEcho "DISK_SPACE_MIN in ${conf} not configure! please check." >> ${FILE_RUNINFO}Exitelif ! (( ${DISK_SPACE_MIN}>0 ));thenEcho "DISK_SPACE_MIN in ${conf} not a positive integer! please check." >> ${FILE_RUNINFO}Exitfiif [[ -z "${DISK_SPACE_MAX_RATE}" ]];thenEcho "DISK_SPACE_MAX_RATE in ${conf} not configure! please check." >> ${FILE_RUNINFO}Exitelif ! (( ${DISK_SPACE_MAX_RATE}>0 ));thenEcho "DISK_SPACE_MAX_RATE in ${conf} not a positive integer! please check." >> ${FILE_RUNINFO}Exitfiif [[ -z "${KEEP_TIME_MIN}" ]];thenEcho "KEEP_TIME_MIN in ${conf} not configure! please check." >> ${FILE_RUNINFO}Exitelif ! (( ${KEEP_TIME_MIN}>0 ));thenEcho "KEEP_TIME_MIN in ${conf} not a positive integer! please check." >> ${FILE_RUNINFO}Exitfilocal is_exit=0echo ${DIR_CLEAR} | awk -v RS=";" '{print $1}' | while read linedolocal dir_clear=$(echo ${line} | awk -F',' '{print $1}')local depth=$(echo ${line} | awk -F',' '{print $2}')local reg_exp=$(echo ${line} | awk -F',' '{print $3}')if ! [[ -d "${dir_clear}" ]];thenEcho "${dir_clear} in ${conf} not directory! please check." >> ${FILE_RUNINFO}exit 1fiif [[ -z "${depth}" ]];thenEcho "DIR_CLEAR in ${conf} configure wrong! please check." >> ${FILE_RUNINFO}exit 1elif ! (( ${depth}>0 ));thenEcho "DIR_CLEAR in ${conf} configure wrong! please check." >> ${FILE_RUNINFO}exit 1fidoneis_exit=$?if ((${is_exit}!=0));thenExitfi
}
################################################################################################################################################
# 函 数 名  : DeployCron
# 功能描述  : 在脚本第一次运行是配置定时任务,将本设置为每小时的10分运行
# 输入参数  : 无
# 返 回 值  : 无
# 调用函数  : 无
# 修改历史      :
#  1.日    期   : 2014年09月01日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function DeployCron
{local script="${DIR_INSTALL}/${SCRIPT_NAME}.sh"if ! egrep -q "${script}" /etc/crontab;thenecho "10 * * * * * root ${script}" >> /etc/crontabEcho "create crontab \"10 * * * * root ${script}\"" >> ${FILE_RUNINFO}Exitfi
}
################################################################################################################################################
# 函 数 名  : GetFileTime
# 功能描述  : 计算文件时间
# 输入参数  : 文件绝对路径
# 返 回 值  : 文件UTC时间
# 调用函数  : 无
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function GetFileTime
{local file="$1"file_sec=$(stat -c %Y ${file})echo ${file_sec}
}
################################################################################################################################################
# 函 数 名  : FileDelete
# 功能描述  : 根据时间、磁盘空间等信息判断是否删除文件
# 输入参数  : 文件绝对路径
# 返 回 值  : 文件删除日志
# 调用函数  : Echo
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
#  2.日    期   : 2014年09月02日
#    作    者   : 曹海涛
#    修改内容   : 优化告警策略
########################################################################
function FileDelete
{local delete_file="$1"local utc_now=$(date +'%s')local file_sec=$(GetFileTime ${delete_file})local disk_space_remain=$(df -m ${delete_file} | tail -1 | awk '{print $4}')local disk_space_rate=$(df -m ${delete_file} | tail -1 | awk '{print $5}' | awk -F'%' '{print $1}')local interval=$(( (${DATE_NOW}-${file_sec})/3600 ))local disk_space_remain_GB=$((${disk_space_remain}/1024))if [[ $delete_file =~ marker ]]thenecho "mker"elseif     (( ${interval}>${KEEP_TIME_MAX} || ${disk_space_remain_GB}<${DISK_SPACE_MIN} || ${disk_space_rate}>${DISK_SPACE_MAX_RATE} ));thenif (( ${interval}>${KEEP_TIME_MAX} ));thenrm -rf ${delete_file}Echo "delete ${delete_file}" >> ${FILE_LOG_NORMAL}elif (( ${interval}>${KEEP_TIME_MIN} ));thenrm -rf ${delete_file}echo "${utc_now},1,1,$(dirname ${delete_file}) not have enough space and delete ${delete_file}" >> ${FILE_LOG_ERROR}elseecho "${utc_now},1,1,$(dirname ${delete_file}) not have enough space" >> ${FILE_LOG_ERROR}fififi
}
################################################################################################################################################
# 函 数 名  : Main
# 功能描述  : 入口函数,解析配置文件,调用目录遍历函数
# 输入参数  : 无
# 返 回 值  : 无
# 调用函数  : ListDir
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function Main
{echo ${DIR_CLEAR} | awk -v RS=";" '{print $1}' | while read linedolocal dir_clear=$(echo ${line} | awk -F',' '{print $1}')local depth=$(echo ${line} | awk -F',' '{print $2}')local reg_exp=$(echo ${line} | awk -F',' '{print $3}')#if [[ -z ${reg_exp} ]];then#  reg_exp=".*"#fireg_exp="${REG_EXP}"ListDir "${dir_clear}" "${depth}" "${reg_exp}"done
}
################################################################################################################################################
# 函 数 名  : ListDir
# 功能描述  : 目录遍历函数,通过递归调用对目录进行指定深度的扫描。
#             并对扫描到的每个文件名称进行规则匹配并调用FileDelete
# 输入参数  : 目录路径、扫描深度、文件命名规则
# 返 回 值  : 无
# 调用函数  : ListDir、FileDelete
# 修改历史      :
#  1.日    期   : 2014年08月29日
#    作    者   : 曹海涛
#    修改内容   : 新生成函数
########################################################################
function ListDir
{local dir="$1"local depth="$2"local exp="$3"if [[ -z ${exp} ]];thenexp=".*"fils -1t ${dir} | tac | egrep "${exp}" | while read filedoif [[ -d "${dir}/${file}" ]] && ((${depth}>1));thenlocal depth_sub=${depth}((depth_sub--))ListDir "${dir}/${file}" "${depth_sub}"local file_num=$(ls -1 ${dir}/${file} | wc -l)if ((${file_num}==0));then#rm -rf "${dir}/${file}"Echo "delete empty directory ${dir}/${file}" >> ${FILE_LOG_NORMAL}fielseFileDelete "${dir}/${file}"fidone
}
################################################################################################################################################
# BEGINNING OF MAIN
########################################################################
PS4='+[$LINENO:${FUNCNAME[0]:-$0}()]'
shopt -s expand_aliasesInitEnv
ImportConf
DeployCron
Main
Exit
########################################################################
# End of script
########################################################################

common_clear.conf

#待删除目录,支持多个目录,多个目录以";"分隔
#每个目录由两个必选参数组成,以","分隔,依次为:
#必选参数1:待删除目录路径,请使用绝对路径,如"/home/aa/bb"
#必选参数2:目录扫描深度,请使用大于等于1的整数:
#1为只扫描当前目录,不对子目录进行扫描,2对子目录进行扫描,3对子目录的子目录进行扫描,以此类推
#示例:DIR_CLEAR="/tmp/userflow,2;/tmp/userurl,3"
DIR_CLEAR="/var/www/html/upload,6;/usr/local/freeswitch/recordings,2"#文件最大保存时间,文件时间超过此时间的文件将被删除,单位小时
KEEP_TIME_MAX="90000"#待删除目录磁盘最小剩余空间,当磁盘空间小于最小剩余空间时,
#将依次删除最老的文件,直到磁盘空间不小于最小剩余空间,单位GBytes
DISK_SPACE_MIN="1"#待删除目录磁盘最大使用率,当磁盘使用率大于最大磁盘使用率时,
#将依次删除最老的文件,直达磁盘空间使用率不大于最大磁盘空间使用率,
#单位百分比,90即为最大磁盘使用率为90%
DISK_SPACE_MAX_RATE="90"#文件最小保存时间,文件时间小于此时间的文件将无视删除策略并被保留
#当文件最小保存时间与上述删除策略冲突时会发送告警信息,单位小时
KEEP_TIME_MIN="360"

通用文件清除脚本,可对多个指定目录按照磁盘空间、文件保存天数进行清理,并可设置目录扫描深度相关推荐

  1. ets5怎么找到数据文件夹_mac怎么清理磁盘空间?如何找到并清理Mac电脑“其他”文件?...

    相信大部分的Mac电脑用户都会有一个疑问,那就是"关于本机"中的那个"其他"类型到底是什么?为什么占据了那么大的磁盘空间,而在目前SSD固态硬盘空间有限的情况下 ...

  2. 复制文件或文件夹时出错(无法复制***:没有足够的可用磁盘空间。) .

    硬盘还剩好几十G的空间,但复制一个4G多的文件却提示: 无法复制***:没有足够的可用磁盘空间. 请删除部分文件以释放磁盘空间,然后再试. 要删除磁盘上旧的和不必要的文件以便释放磁盘空间,请单击&qu ...

  3. linux 查看磁盘空间 文件 文件夹 大小

    只查看一级目录统计的空间占用 [root@swarm-node1 sdb]# du -h -d1 57M ./leo_log_test 69G ./dsp-bidder-logs 980K ./she ...

  4. linux下使用 du查看某个文件或目录占用磁盘空间的大小

    du -ah --max-depth=1 其中a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度.

  5. php遍历文件夹及其子文件夹并计算所占的磁盘空间

    2019独角兽企业重金招聘Python工程师标准>>> 主要原因是想查看手机sd卡哪个文件占的空间最大,因为无缘无故sd卡慢了,而又不知道哪些文件和应用占用的空间.但是有访问不了sd ...

  6. Oracle11使用现在数据库文件,oracle11g 重装操作系统后,如何利用原有oracle表空间文件还原数据库...

    oracle11g 重装操作系统后,如何利用原有oracle表空间文件还原数据库 最近由于系统重装,在还原dmp备份文件时,由于数据原因(用exp命令导出时表没有导出全部),导致系统不能正常运行.根据 ...

  7. 复制文件或文件夹时出错(无法复制***:没有足够的可用磁盘空间

    无法复制***:没有足够的可用磁盘空间. 请删除部分文件以释放磁盘空间,然后再试. 要删除磁盘上旧的和不必要的文件以便释放磁盘空间,请单击"磁盘整理". "磁盘碎片整理& ...

  8. Windows微信聊天图片文件的解码和图片、视频占满电脑磁盘空间的清理

    1 问题现象 我的Windows版微信最近老是提示"磁盘空间不足200MB,需及时清理磁盘". 使用文件资源管理器查看我的电脑磁盘使用情况,发现C盘只剩下174MB空间可用.系统盘 ...

  9. for循环批量写文件 shell_shell脚本:for循环批量重命名带空格文件名的文件

    今天在学习shell脚本攻略第二章2.13 批量重命名和移动时,由于我的文件命令有的文件名字中出现空格,出现了许多问题,因此将解决问题的过程记录了下来,希望能够和大家交流学习,共同进步,谢谢! 问题代 ...

最新文章

  1. [数据结构]对称矩阵和三角矩阵压缩公式
  2. Java 对象的序列化
  3. 牛客竞赛,ZUST第17届公开赛,摸鱼记(A、DEFGH、J题解,3/7题代码)
  4. spring5.0学习笔记7
  5. mysql社工库搭建教程,分享我的社工库的裤子+sphinx社工库搭建教程
  6. TransCAD实用技术梗概
  7. 城通网盘仿蓝奏网盘源码|字母哥网盘|+搭建文档教程
  8. 对企业形象识别系统(CIS)的了解
  9. 平房误差函数_平方误差函数(square error function)与平方损失函数(square loss function)...
  10. Android上传图片的方式
  11. 创世神曲java官网_创世神曲官网下载
  12. 微博秒拍等网站的视频图片下载工具:在线下载工具
  13. Java 五子棋 包含强大人机 步骤流程 包含源码
  14. linux 博通wifi驱动,博通WiFi驱动
  15. starday跨境电商平台发展迅猛,主打高性价比的产品优势来了!
  16. Firefox火狐Flash插件卡死问题完美解决方法
  17. README.generic-sessions.md
  18. RK WiFi驱动层初始化分析
  19. 自媒体平台营销变现,今日头条如何开通收益引流方法教程
  20. FE内容付费系统响应式(带手机版) v5.46

热门文章

  1. 如何通过RSS来订阅天气预报
  2. 用计算机弹奏若当来世,若当来世简谱(歌词)-马里奥、冥月演唱-动画片《狐妖小红娘 第三季》片头曲...
  3. 聪明爸妈的明智抉择,但我还是建议你不要轻易买保险
  4. Java(二)——简单的理解下面向对象内存分析
  5. alin的学习之路:嵌入式课程设计总结(基于Linux的Qt版MP3播放器)
  6. 连花清瘟胶囊新冠应用 大健康医药·李喜贵:微量元素作用解密
  7. MIT博士研发绘画机器人Utensil,精通绘画和激光切割
  8. 匹兹堡大学申请条件计算机科学,匹兹堡大学工程学院计算机科学专业申请条件...
  9. 2345内核拒绝服务漏洞(3)- WORD的锅
  10. Kafka 关于消费者组名Consumer Group