Linux 智能日志定时、定量删除脚本

由于项目里存在一些比较老的组件,这部分组件不支持配置滚动日志删除规则.同时,还有一些其他的非常规日志文件,为了实现日志定时删除功能,于是开始面向CSDN和百度编程,汇总整理了一个定时删除脚本,由于没有系统的学习过Linux的Shell的相关知识,脚本可能处理上略显粗糙,基本能满足相关的功能要求;本文介绍了作者的心路历程,附带完整脚本。

  • 按照最后修改删除距今N天之前的日志
  • 按照目录整体文件大小,并且按照最后修改时间来保留NGb(支持小数、动态调整循环次数)日志文件信息
  • 增加一些简单的非空限制判断、危险路径提示判断

基本思路

  • 删除文件 rm -rf 路径
  • 查找距离当天时间N天的日志文件 find 路径 -name “*.log*” -mtime +N
  • 查看当前目录大小 du -ch 路径

直达结尾(获取完整脚本)

也许你只对结果感兴趣,对于这个过程兴趣缺缺,戳这里

Step 1 找到待处理的文件(主要针对日志)

find --help
-type f 指定查找类型是文件
-name 根据名称查找,后面的参数不带引号括起来就是精确查找,不针对路径过滤

不过这种文档稍微有点不太友好,还需要辅助查询些辅助资料,结合资料来试验,一番试验以后基本确定使用如下几类find指令

入门版
  • 根据名称查找包含.log字符的文件,同时要避免删除jar和配置文件等等
# -name 这个效果其实可以结合grep管道指令过滤来实现,这个完全看个人喜好,这边只是为了精确限定根据文件名过滤
find ${logPath} -type f -name "*.log*"
初级版
  • 据名称查找包含.log字符的文件,同时要避免删除jar和配置文件等等
find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"
中级版
  • 做着做着发现还需要能根据时间排序,想着就用ls 结合 find 来使用
ls -lt `find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"`

grep 用于对脚本执行结果整体,以行的维度进行过滤
grep -v 不等于,保留不满足匹配条件的结果
grep -E "|" 用于匹配多个条件,中间用|分隔

`` 两个脚本结合起来使用这个有多种实现方式,这里用到了 指令 `优先执行指令` 这种方式,这个括起来的符号是Tab键上面那个字符
中级plus版
  • 做着做着发现还需要能根据时间排序,想着就用ls 结合 find 来使用+awk 和 grep 做结果筛选
# ls -t 不加参数l的时候展示信息不全,为了验证可以加上,实际执行的时候也可以不加,这样免得在用awk做过滤
ls -lt `find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` |awk -F ' ' '{print$9}' |grep ^/  |grep -v :$ 

awk 用于对脚本执行结果整体,以列的维度进行过滤
awk -F '指定列分隔符' '保留展示信息'  # awk -F ' ' '{print$9}' 使用空格拆分结果,并且保留显示第9列,具体多少可以自己数

grep ^/ 匹配以指定字符(/)开头的部分
grep :$ 匹配以指定字符(:)结尾的部分
grep -E "|" 用于匹配多个条件,中间用|分隔
高级版
  • 仅根据.log做匹配过滤单一,想着增加下过滤条件

这地方是踩了一些坑的,各种尝试以后才发现目前这种可行的方案,当然回想起来也许完全用grep来过滤这种方式更优,毕竟只做了一次find然后对着结果grep一通

tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`

echo $tempResultAll

``||`` 将两个独立运行的指令结果合并到一起返回 
当不方面将所需多个指令在一行完成时,可以考虑拆分未两个指令,类似如下效果
- 变量=指令`指令`
- echo $变量
终级版
  • 全部功能结合在一起 按照时间倒序获取文件名中包含 .log 或者 .out 的非jar、xml、properties、yml文件(抠掉目录)
tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`

# 其实对于根据修改最后时间来删除文件这种做法时没必要一定要将文件按照时间顺序排列给出
ls -lt $tempResultAll |awk -F ' ' '{print$9}' |grep ^/  |grep -v :$

知识点总结
  • find 指令的使用 按照文件名称包含字符和按照最后修改时间
  • grep 用于对脚本执行结果整体,以行的维度进行过滤
  • awk 用于对脚本执行结果整体,以列的维度进行过滤
  • 将一个指令运行的结果作为另一个指令运行的参数类似 ls -l find / -name xxx,当出现多层嵌套无法一行处理完时,考虑拆分执行
  • 将两个指令的运行结果合并在一起返回 find / -name "*.log*"||find / -name "*.out*"

有时候此路不通换个思路特别重要,有时候写代码就特别容易硬肝,这种事还有瘾,不要一条路到底,慎重!!!

Step 2 按照最后修改时间过滤

这个就比较简单了,百度出来的很多都一句话搞定,我这边做了一些额外限制的所以会复杂些,拼接下还是可以快速搞定的

tempResultAll=`setp 1 执行完以后的结果`
find $tempResultAll -mtime +N |grep -v :$

Step 3 按照文件大小、修改时间来过滤

入门版
tempResultAll=`setp 1 执行完以后的结果`
du -ch $tempResultAll
入门plus版
tempResultAll=`setp 1 执行完以后的结果`
# 但是这样只能获取到字符结果,无法获取到具体数值
du -ch $tempResultAll |tail -n1 |awk -F ' ' '{print $1}'

du -ch 路径 展示路径中各个文件或者目录的大小,并且在最后展示这部分内容的总大小,以GB为单位展示,小于1GB的用MB,小于1MB的用KB 如果整个路径的大小都是KB的,单位会省略
tail -nxx 从结果尾部开始读取xx行


中级版

这里取了巧:做字符截取的方式来实现,好在目前这个文件大小单位就有限的几种,不然这种方案要跪;还有关于数值判断长度单位的

tempResultAll=`setp 1 执行完以后的结果`
totalSizeStr = `du -ch $tempResultAll |tail -n1 |awk -F ' ' '{print $1}'`


# 如果字符截取后和原字符相等,则表明截取失败,结果单位不是这种类型的 计算完成以后都实现去直接忽略小数点后的数值
if [[  x"${totalSizeStr%K*}K" == x"${totalSizeStr}"  ]] ; then
 totalSize=${totalSizeStr%K*}
 let totalSize=${totalSize%.*}
elif [[  x"${totalSizeStr%M*}M" == x"${totalSizeStr}"  ]] ; then
  totalSize=${totalSizeStr%M*}
 totalSize=$(echo "scale=0; ${totalSize}*$sizeKtMtGB" | bc )
  let totalSize=${totalSize%.*}
elif [[  x"${totalSizeStr%G*}G" == x"${totalSizeStr}"  ]] ; then
  totalSize=${totalSizeStr%G*}
 totalSize=$(echo "${totalSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )
 let totalSize=${totalSize%.*}
else
   let totalSize=${totalSize%.*}
fi


#根据当前待处理文件总数动态确定for循环一次增加读取的文件数量(代码中有一个日志比较坑,文件少,数量多,index=1 效率太低)
let totalFileNum=`find ${tempResultAll} |wc -l`
let totalFileNumIndex=`expr length ${totalFileNum}`
if [[ ${totalFileNumIndex} -eq 3  ]] ;then
   #echo =3
   let loopSize=10
elif [[ ${totalFileNumIndex} -eq 4  ]] ;then
   #echo =4
   let loopSize=100
elif [[ ${totalFileNumIndex} -eq 5  ]] ;then
   #echo =5
   let loopSize=500
elif [[ ${totalFileNumIndex} -eq 6 ]] ;then
   #echo =6
   let loopSize=5000
fi

#当文件分布极度不均衡时,为了保障尽可能的删除超过限制的文件,设置循环index略微大一点
maxLoop=$(echo "$totalFileNum/$loopSize*($loopSize+1)" | bc)

#这里面信息量比较大

${totalSizeStr%M*}  截取属性${totalSizeStr}中M字符左边的部分
x"${totalSizeStr%G*}G" == x"${totalSizeStr}"  linux 字符串比较,也可以用-eq,带x""是为了避免属性为空影响运行
$(echo "${totalSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )  复杂运算用bc,省事又轻松,自己写真的挺多坑
let totalSize=${totalSize%.*}  let 整数类型的字符申明,其他类型的会报错
if [[ ]] ;then elif [[ ]] ;then else xx fi Linux if else 简单用法 

中级plus版(接上面加上for循环)

功能本身基础,就是逻辑多,这感觉像极了写java代码

for ((i=1;i<=${maxLoop};i=i+$loopSize));
do
   #echo "循环中............................index i="$i
   #排序的分页数据
   tempResult=`ls ${sizeTempSortResultAll} | head -n${i}`
   #echo tempResult=${tempResult}
   if [[ -n "${tempResult}" ]] ; then
      #echo i=${i}
     currentSizeStr=`du -ch ${tempResult} |tail -n1 |awk -F ' ' '{print $1}' `
      #echo "currentSizeStr="${currentSizeStr}
	 if [[  x"${currentSizeStr%K*}K" == x"${currentSizeStr}"  ]] ; then
         currentSize=${currentSizeStr%K*}
         let currentSize=${currentSize%.*}
	 elif [[ x"${currentSizeStr%M*}M" == x"${currentSizeStr}"  ]] ; then
		 currentSize=${currentSizeStr%M*}
	     currentSize=$(echo "${currentSize}*$sizeKtMtGB" | bc )
	     let currentSize=${currentSize%.*}
	 elif [[ x"${currentSizeStr%G*}G" == x"${currentSizeStr}"  ]] ; then
		 currentSize=${currentSizeStr%G*}
	     currentSize=$(echo "${currentSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )
	     let currentSize=${currentSize%.*}
     else
	     currentSize=$(echo "${currentSize}*1" | bc )
	     let currentSize=${currentSize%.*}
	 fi

     if [[ $(echo "${currentSize} >= ${dayOrSizeNum} " | bc ) -eq 1  ]] ; then
         echo "当前下标值是"${i}"可以删除"${i}"之后的部分内容文件"
         #为了避免少删除文件,当文件数量较大的时候可能会一定程度的多删除一些文件
     	 let deleteNum=`expr ${totalFileNum} - ${i} + $loopSize`
     	 #echo deleteNum=$deleteNum
         toDeleteFiles=`ls ${sizeTempSortResultAll}  |tail -n$deleteNum `
		 #echo $toDeleteFiles
          for i in $(ls $toDeleteFiles );
          do
             #echo "即将删除" `ls -lh ${i}`
            if [[ -n "$( ls ${i} |grep .out$ )" ]] ; then
               rm -rf ${i}
               touch ${i}
             else
               rm -rf ${i}
             fi
			#echo "删除文件" $i
          done
     	 echo "执行删除后(待删除文件)"
		 tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
          totalSizeStr=`du -ch ${tempResultAll} |tail -n1 |awk -F ' ' '{print $1}'`
		 echo "剩余日志文件大小" $totalSizeStr
     	 exit 0
	  fi
  else
    echo "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"
    exit 0
  fi
done
echo "执行删除后"
ls -lth ${tempResult} |wc -l
currentSizeStr=`du -ch ${tempResult} |tail -n1 |awk -F ' ' '{print $1}' `
echo "剩余文件大小"$currentSizeStr

完成脚本执行效果

#按照指定文件大小保留(保留10M)
[hsyt@hsyt006 ~]$ sh /home/autoFilesCleaner.sh /home/logs/mhp-rpc-tasks/ size 0.01
logPath=/home/logs/mhp-rpc-tasks/ cleanType=size dayOrSizeNum=10485
待保留文件大小为 10485 KB
totalFileNum=238
执行删除前
238
totalFileNum=238
当前下标值是21可以删除21之后的部分内容文件
执行删除后(待删除文件)
剩余日志文件大小 14M


#按照指定文件最后修改时间保留(保留10天内的文件)
[hsyt@hsyt006 ~]$ sh /home/autoFilesCleaner.sh /home/logs/mhp-rpc-pat/ date 10
logPath=/home/logs/mhp-rpc-pat/ cleanType=date dayOrSizeNum=10
执行删除前
55
执行删除后(待删除部分内容)
45

配置linux定时任务

查看定时器列表
crontab -l
新增定时器配置
crontab -e
每天1点清理数据

cornTab 定时器格式说明minute hour day-of-month month-of-year day-of-week commands

样例

配置定时任务,同时将执行结果重定向到文件中

* 1 * * *  sh /shengji/autoFilesCleaner.sh /home/elk/ size 1 				>> /home/tool/cleanLogsRecord/$(date +%Y%m%d_%H%M%S)clean.log
查看linux定时任务执行日志
#先用root账号给其他账号赋权读取
chmod -o+r /var/log/cron

#查看Linux定时任务执行记录(当定时任务配置的有问题时,重定向文件路径下会没有只)
tail -f /var/log/cron

完整版脚本

如果拷贝下来有问题,就下载源文件 CSDN下载链接
linux 环境下调试测试脚本 sh -x xxx.sh 方便很好用

#!/usr/bin/env bash
set -e
export LANG=zh_CN.utf-8
## 如果脚本启动报错syntax error: unexpected end of file
## 请使用vim编辑脚本,退出编辑模式,输入 :set ff=unix 将脚本格式改为unix

#获取语句本身
PRG=$0
##echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum "

#获取日志文件存放路径  logPath
logPath=$1

#获取日志删除策略 date|size
cleanType=$2

#数量信息 ...前面传入date时单位是天,前面传入size时单位是G,代表文件大小时可以是小数
dayOrSizeNum=$3

if [[ ! -n "${logPath}"  ]] ; then
   echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"
   exit 0
fi

if [[ ! ${logPath} == /*  ]] ; then
   echo "请填写绝对路径"
   echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"
   exit 0
fi

if [[ ! ${logPath} == /home/*  ]] && [[ ! ${logPath} == /data/ftp/logs/*  ]] ; then
   echo ${logPath}"下的路径暂时不允许直接作为操作目录,建议将程序日志打印路径设置到/home/logs或者/data/ftp/logs/路径下"
   echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"
   exit 0
fi



#数据大小 Kb MB Gb中间转换的单位
let sizeKtMtGB=1024

#默认数据保留时间
let logKeepDays=90

#默认日志数据保留限制大小
let logKeepGB=5

#当根据文件大小来删除数据时
let loopSize=1





# 默认根据日期来保留信息
if [[ ! -n "${cleanType}"  ]] ; then
   cleanType="date"
fi

if [[ x"${cleanType}" == x"date" ]] ; then
   if [[ ! -n "${dayOrSizeNum}" ]] ; then
      dayOrSizeNum=${logKeepDays}
   elif [[ "${dayOrSizeNum}" -gt ${logKeepDays} ]] ; then
      dayOrSizeNum=${logKeepDays}
   elif [[ 0 -gt "${dayOrSizeNum}" ]] ; then
      dayOrSizeNum=${logKeepDays}
   fi
   echo logPath=${logPath} cleanType=${cleanType} dayOrSizeNum=${dayOrSizeNum}
   #为了避免误删信息,删除的内容里必须带上log字符,不能是jar包、xml、properties、yml文件
   #find ${logPath} |grep -E "log|out"-mtime -${dayOrSizeNum} |grep -vE ".jar|.xml|.properties|.yml" | xargs ls -lt |grep ^/ |awk -F ' ' '{print$9}' -exec rm -rf {} \;
   #tempResultLog='find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"'
   #tempResultOut='find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"'
   #tempResultAll=$($tempResultLog) || $($tempResultOut)
   
   tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
   echo "执行删除前"
   ls ${tempResultAll} |wc -l
   dateTempResult=`find ${tempResultAll}  -mtime +${dayOrSizeNum} |grep -v :$`;
   if test ! -z "$(ls ${dateTempResult})" ; then
      dateTempSortResultALL=`ls -lt ${dateTempResult} |awk -F ' ' '{print$9}' |grep ^/  |grep -v :$ `
      for i in $( ls $dateTempSortResultALL );
	  do
		 #echo "即将删除" `ls -lh ${i}`
		 if [[ -n "$( ls ${i} |grep .out$ )" ]] ; then
		   rm -rf ${i}
		   touch ${i}
		 else
		   rm -rf ${i}
		 fi
	  done
	  echo "执行删除后(待删除部分内容)"
      tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
	  ls $tempResultAll |wc -l
   fi
elif [[ x"${cleanType}" == x"size" ]] ; then
   if [[ ! -n "${dayOrSizeNum}" ]] ; then
      #echo "111111111111"
      dayOrSizeNum=$(echo "$logKeepGB*$sizeKtMtGB*$sizeKtMtGB" | bc )
      let dayOrSizeNum=${dayOrSizeNum%.*}
   #elif [[ "${dayOrSizeNum}" -gt $logKeepGB ]] ; then
   elif [[ $(echo "${dayOrSizeNum} > $logKeepGB" | bc ) -eq 1 ]] ; then
      #echo "2222222222222"
      dayOrSizeNum=$(echo "$logKeepGB*$sizeKtMtGB*$sizeKtMtGB" | bc )
      let dayOrSizeNum=${dayOrSizeNum%.*}
   #elif [[ 0 -gt "${dayOrSizeNum}" ]] ; then
   elif [[ $(echo "0 > ${dayOrSizeNum} " | bc ) -eq 1  ]] ; then
      #echo "3333333333"
      dayOrSizeNum=$(echo "$logKeepGB*$sizeKtMtGB*$sizeKtMtGB" | bc )
      let dayOrSizeNum=${dayOrSizeNum%.*}
   else
      #echo "4444444444"
      dayOrSizeNum=$(echo "$dayOrSizeNum*$sizeKtMtGB*$sizeKtMtGB" | bc )
      let dayOrSizeNum=${dayOrSizeNum%.*}
   fi
   echo logPath=${logPath} cleanType=${cleanType} dayOrSizeNum=${dayOrSizeNum}
   echo "待保留文件大小为 ${dayOrSizeNum} KB"
   #不排序的全量数据
   #tempResultLog=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"`
   #tempResultOut=`find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
   #tempResultAll=`find ${tempResultLog} ${tempResultOut}`
   tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
   let totalFileNum=`find ${tempResultAll} |wc -l`
   let totalFileNumIndex=`expr length ${totalFileNum}`
   #echo totalFileNumIndex=${totalFileNumIndex}
   if [[ ${totalFileNumIndex} -eq 3  ]] ;then
      #echo =3
      let loopSize=10
   elif [[ ${totalFileNumIndex} -eq 4  ]] ;then
      #echo =4
      let loopSize=100
   elif [[ ${totalFileNumIndex} -eq 5  ]] ;then
      #echo =5
      let loopSize=500
   elif [[ ${totalFileNumIndex} -eq 6 ]] ;then
      #echo =6
      let loopSize=5000
   fi
   echo totalFileNum=${totalFileNum}
   if [[ ${totalFileNum} -gt 1 ]]; then
       echo "执行删除前"
       #排序的全量数据
       sizeTempSortResultAll=`ls -lt ${tempResultAll} |awk -F ' ' '{print$9}' |grep ^/ |grep -v :$ `
       ls ${sizeTempSortResultAll} |wc -l

       totalSizeStr=`du -ch ${sizeTempSortResultAll} |tail -n1 |awk -F ' ' '{print $1}'`
       #echo "totalSizeStr="${totalSizeStr}

       # 计算完成以后都实现去直接忽略小数点后的数值

       if [[  x"${totalSizeStr%K*}K" == x"${totalSizeStr}"  ]] ; then
    	 totalSize=${totalSizeStr%K*}
    	 let totalSize=${totalSize%.*}
       elif [[  x"${totalSizeStr%M*}M" == x"${totalSizeStr}"  ]] ; then
         totalSize=${totalSizeStr%M*}
    	 totalSize=$(echo "scale=0; ${totalSize}*$sizeKtMtGB" | bc )
         let totalSize=${totalSize%.*}
       elif [[  x"${totalSizeStr%G*}G" == x"${totalSizeStr}"  ]] ; then
         totalSize=${totalSizeStr%G*}
    	 totalSize=$(echo "${totalSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )
    	 let totalSize=${totalSize%.*}
       else
          let totalSize=${totalSize%.*}
       fi

       if [[ ${dayOrSizeNum} -gt ${totalSize}  ]] ;then
         echo "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"
         exit 0
       fi
       echo totalFileNum=${totalFileNum}
	   #echo loopSize=$loopSize
	   maxLoop=$(echo "$totalFileNum/$loopSize*($loopSize+1)" | bc)
	   #echo maxLoop=$maxLoop
       for ((i=1;i<=${maxLoop};i=i+$loopSize));
       do
          #echo "循环中............................index i="$i
          #排序的分页数据
          tempResult=`ls ${sizeTempSortResultAll} | head -n${i}`
          #echo tempResult=${tempResult}
          if [[ -n "${tempResult}" ]] ; then
             #echo i=${i}
    	     currentSizeStr=`du -ch ${tempResult} |tail -n1 |awk -F ' ' '{print $1}' `
             #echo "currentSizeStr="${currentSizeStr}
    		 if [[  x"${currentSizeStr%K*}K" == x"${currentSizeStr}"  ]] ; then
    	         currentSize=${currentSizeStr%K*}
    	         let currentSize=${currentSize%.*}
    		 elif [[ x"${currentSizeStr%M*}M" == x"${currentSizeStr}"  ]] ; then
    			 currentSize=${currentSizeStr%M*}
    		     currentSize=$(echo "${currentSize}*$sizeKtMtGB" | bc )
    		     let currentSize=${currentSize%.*}
    		 elif [[ x"${currentSizeStr%G*}G" == x"${currentSizeStr}"  ]] ; then
    			 currentSize=${currentSizeStr%G*}
    		     currentSize=$(echo "${currentSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )
    		     let currentSize=${currentSize%.*}
    	     else
    		     currentSize=$(echo "${currentSize}*1" | bc )
    		     let currentSize=${currentSize%.*}
    		 fi

             #echo GB=${currentSize%G*}
             #echo MB=${currentSize%M*}
             #echo KB=${currentSize%K*}
             #echo currentSize=$currentSize

    	     if [[ $(echo "${currentSize} >= ${dayOrSizeNum} " | bc ) -eq 1  ]] ; then
    	         echo "当前下标值是"${i}"可以删除"${i}"之后的部分内容文件"
                 #为了避免少删除文件,当文件数量较大的时候可能会一定程度的多删除一些文件
     	         let deleteNum=`expr ${totalFileNum} - ${i} + $loopSize`
    	     	 #echo deleteNum=$deleteNum
    	         toDeleteFiles=`ls ${sizeTempSortResultAll}  |tail -n$deleteNum `
				 #echo $toDeleteFiles
                 for i in $(ls $toDeleteFiles );
	             do
	                #echo "即将删除" `ls -lh ${i}`
		            if [[ -n "$( ls ${i} |grep .out$ )" ]] ; then
	                  rm -rf ${i}
	                  touch ${i}
	                else
	                  rm -rf ${i}
	                fi
					#echo "删除文件" $i
	             done
    	     	 echo "执行删除后(待删除文件)"
				 tempResultAll=`find ${logPath} -type f -name "*.log*" |grep -vE ".jar|.xml|.properties|.yml"` || `find ${logPath} -type f -name "*.out*" |grep -vE ".jar|.xml|.properties|.yml"`
                 totalSizeStr=`du -ch ${tempResultAll} |tail -n1 |awk -F ' ' '{print $1}'`
				 echo "剩余日志文件大小" $totalSizeStr
    	     	 exit 0
			  fi
    	  else
    	    echo "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"
            exit 0
    	  fi
       done
       echo "执行删除后"
       ls -lth ${tempResult} |wc -l
	   currentSizeStr=`du -ch ${tempResult} |tail -n1 |awk -F ' ' '{print $1}' `
	   echo "剩余文件大小"$currentSizeStr
   else
     echo "当前目录下 ${logPath} 无可删除文件"
   fi
else
  echo "请传入合适的日志删除规则{date|size}   "
  echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"
fi



exit 0


参考资料

Linux中find命令用法大全
Linux定时删除日志的简单实现方法
Linux bc命令
Linux 的字符串截取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值