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

2024-04-07 12:18

本文主要是介绍Linux 智能日志定时、定量删除脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文档目录

    • 基本思路
      • 直达结尾(获取完整脚本)
      • Step 1 找到待处理的文件(主要针对日志)
        • 入门版
        • 初级版
        • 中级版
        • 中级plus版
        • 高级版
        • 终级版
        • 知识点总结
      • Step 2 按照最后修改时间过滤
      • Step 3 按照文件大小、修改时间来过滤
        • 入门版
        • 入门plus版
        • 中级版
        • 中级plus版(接上面加上for循环)
      • 完成脚本执行效果
      • 配置linux定时任务
        • 查看定时器列表
        • 新增定时器配置
        • 每天1点清理数据
        • 样例
        • 查看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}"  ]] ; thentotalSize=${totalSizeStr%K*}let totalSize=${totalSize%.*}
elif [[  x"${totalSizeStr%M*}M" == x"${totalSizeStr}"  ]] ; thentotalSize=${totalSizeStr%M*}totalSize=$(echo "scale=0; ${totalSize}*$sizeKtMtGB" | bc )let totalSize=${totalSize%.*}
elif [[  x"${totalSizeStr%G*}G" == x"${totalSizeStr}"  ]] ; thentotalSize=${totalSizeStr%G*}totalSize=$(echo "${totalSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )let totalSize=${totalSize%.*}
elselet totalSize=${totalSize%.*}
fi#根据当前待处理文件总数动态确定for循环一次增加读取的文件数量(代码中有一个日志比较坑,文件少,数量多,index=1 效率太低)
let totalFileNum=`find ${tempResultAll} |wc -l`
let totalFileNumIndex=`expr length ${totalFileNum}`
if [[ ${totalFileNumIndex} -eq 3  ]] ;then#echo =3let loopSize=10
elif [[ ${totalFileNumIndex} -eq 4  ]] ;then#echo =4let loopSize=100
elif [[ ${totalFileNumIndex} -eq 5  ]] ;then#echo =5let loopSize=500
elif [[ ${totalFileNumIndex} -eq 6 ]] ;then#echo =6let 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}"  ]] ; thencurrentSize=${currentSizeStr%K*}let currentSize=${currentSize%.*}elif [[ x"${currentSizeStr%M*}M" == x"${currentSizeStr}"  ]] ; thencurrentSize=${currentSizeStr%M*}currentSize=$(echo "${currentSize}*$sizeKtMtGB" | bc )let currentSize=${currentSize%.*}elif [[ x"${currentSizeStr%G*}G" == x"${currentSizeStr}"  ]] ; thencurrentSize=${currentSizeStr%G*}currentSize=$(echo "${currentSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )let currentSize=${currentSize%.*}elsecurrentSize=$(echo "${currentSize}*1" | bc )let currentSize=${currentSize%.*}fiif [[ $(echo "${currentSize} >= ${dayOrSizeNum} " | bc ) -eq 1  ]] ; thenecho "当前下标值是"${i}"可以删除"${i}"之后的部分内容文件"#为了避免少删除文件,当文件数量较大的时候可能会一定程度的多删除一些文件let deleteNum=`expr ${totalFileNum} - ${i} + $loopSize`#echo deleteNum=$deleteNumtoDeleteFiles=`ls ${sizeTempSortResultAll}  |tail -n$deleteNum `#echo $toDeleteFilesfor i in $(ls $toDeleteFiles );do#echo "即将删除" `ls -lh ${i}`if [[ -n "$( ls ${i} |grep .out$ )" ]] ; thenrm -rf ${i}touch ${i}elserm -rf ${i}fi#echo "删除文件" $idoneecho "执行删除后(待删除文件)"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 "剩余日志文件大小" $totalSizeStrexit 0fielseecho "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"exit 0fi
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=$3if [[ ! -n "${logPath}"  ]] ; thenecho "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"exit 0
fiif [[ ! ${logPath} == /*  ]] ; thenecho "请填写绝对路径"echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"exit 0
fiif [[ ! ${logPath} == /home/*  ]] && [[ ! ${logPath} == /data/ftp/logs/*  ]] ; thenecho ${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}"  ]] ; thencleanType="date"
fiif [[ x"${cleanType}" == x"date" ]] ; thenif [[ ! -n "${dayOrSizeNum}" ]] ; thendayOrSizeNum=${logKeepDays}elif [[ "${dayOrSizeNum}" -gt ${logKeepDays} ]] ; thendayOrSizeNum=${logKeepDays}elif [[ 0 -gt "${dayOrSizeNum}" ]] ; thendayOrSizeNum=${logKeepDays}fiecho 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 -ldateTempResult=`find ${tempResultAll}  -mtime +${dayOrSizeNum} |grep -v :$`;if test ! -z "$(ls ${dateTempResult})" ; thendateTempSortResultALL=`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$ )" ]] ; thenrm -rf ${i}touch ${i}elserm -rf ${i}fidoneecho "执行删除后(待删除部分内容)"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 -lfi
elif [[ x"${cleanType}" == x"size" ]] ; thenif [[ ! -n "${dayOrSizeNum}" ]] ; then#echo "111111111111"dayOrSizeNum=$(echo "$logKeepGB*$sizeKtMtGB*$sizeKtMtGB" | bc )let dayOrSizeNum=${dayOrSizeNum%.*}#elif [[ "${dayOrSizeNum}" -gt $logKeepGB ]] ; thenelif [[ $(echo "${dayOrSizeNum} > $logKeepGB" | bc ) -eq 1 ]] ; then#echo "2222222222222"dayOrSizeNum=$(echo "$logKeepGB*$sizeKtMtGB*$sizeKtMtGB" | bc )let dayOrSizeNum=${dayOrSizeNum%.*}#elif [[ 0 -gt "${dayOrSizeNum}" ]] ; thenelif [[ $(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%.*}fiecho 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 =3let loopSize=10elif [[ ${totalFileNumIndex} -eq 4  ]] ;then#echo =4let loopSize=100elif [[ ${totalFileNumIndex} -eq 5  ]] ;then#echo =5let loopSize=500elif [[ ${totalFileNumIndex} -eq 6 ]] ;then#echo =6let loopSize=5000fiecho totalFileNum=${totalFileNum}if [[ ${totalFileNum} -gt 1 ]]; thenecho "执行删除前"#排序的全量数据sizeTempSortResultAll=`ls -lt ${tempResultAll} |awk -F ' ' '{print$9}' |grep ^/ |grep -v :$ `ls ${sizeTempSortResultAll} |wc -ltotalSizeStr=`du -ch ${sizeTempSortResultAll} |tail -n1 |awk -F ' ' '{print $1}'`#echo "totalSizeStr="${totalSizeStr}# 计算完成以后都实现去直接忽略小数点后的数值if [[  x"${totalSizeStr%K*}K" == x"${totalSizeStr}"  ]] ; thentotalSize=${totalSizeStr%K*}let totalSize=${totalSize%.*}elif [[  x"${totalSizeStr%M*}M" == x"${totalSizeStr}"  ]] ; thentotalSize=${totalSizeStr%M*}totalSize=$(echo "scale=0; ${totalSize}*$sizeKtMtGB" | bc )let totalSize=${totalSize%.*}elif [[  x"${totalSizeStr%G*}G" == x"${totalSizeStr}"  ]] ; thentotalSize=${totalSizeStr%G*}totalSize=$(echo "${totalSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )let totalSize=${totalSize%.*}elselet totalSize=${totalSize%.*}fiif [[ ${dayOrSizeNum} -gt ${totalSize}  ]] ;thenecho "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"exit 0fiecho totalFileNum=${totalFileNum}#echo loopSize=$loopSizemaxLoop=$(echo "$totalFileNum/$loopSize*($loopSize+1)" | bc)#echo maxLoop=$maxLoopfor ((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}"  ]] ; thencurrentSize=${currentSizeStr%K*}let currentSize=${currentSize%.*}elif [[ x"${currentSizeStr%M*}M" == x"${currentSizeStr}"  ]] ; thencurrentSize=${currentSizeStr%M*}currentSize=$(echo "${currentSize}*$sizeKtMtGB" | bc )let currentSize=${currentSize%.*}elif [[ x"${currentSizeStr%G*}G" == x"${currentSizeStr}"  ]] ; thencurrentSize=${currentSizeStr%G*}currentSize=$(echo "${currentSize}*$sizeKtMtGB*$sizeKtMtGB" | bc )let currentSize=${currentSize%.*}elsecurrentSize=$(echo "${currentSize}*1" | bc )let currentSize=${currentSize%.*}fi#echo GB=${currentSize%G*}#echo MB=${currentSize%M*}#echo KB=${currentSize%K*}#echo currentSize=$currentSizeif [[ $(echo "${currentSize} >= ${dayOrSizeNum} " | bc ) -eq 1  ]] ; thenecho "当前下标值是"${i}"可以删除"${i}"之后的部分内容文件"#为了避免少删除文件,当文件数量较大的时候可能会一定程度的多删除一些文件let deleteNum=`expr ${totalFileNum} - ${i} + $loopSize`#echo deleteNum=$deleteNumtoDeleteFiles=`ls ${sizeTempSortResultAll}  |tail -n$deleteNum `#echo $toDeleteFilesfor i in $(ls $toDeleteFiles );do#echo "即将删除" `ls -lh ${i}`if [[ -n "$( ls ${i} |grep .out$ )" ]] ; thenrm -rf ${i}touch ${i}elserm -rf ${i}fi#echo "删除文件" $idoneecho "执行删除后(待删除文件)"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 "剩余日志文件大小" $totalSizeStrexit 0fielseecho "当前目录下 ${logPath} 文件大小 ${totalSizeStr} 小于限制$3 GB,不做删除清理"exit 0fidoneecho "执行删除后"ls -lth ${tempResult} |wc -lcurrentSizeStr=`du -ch ${tempResult} |tail -n1 |awk -F ' ' '{print $1}' `echo "剩余文件大小"$currentSizeStrelseecho "当前目录下 ${logPath} 无可删除文件"fi
elseecho "请传入合适的日志删除规则{date|size}   "echo "Usage ${PRG} {logPath} {date|size} dayOrSizeNum"
fiexit 0

参考资料

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

这篇关于Linux 智能日志定时、定量删除脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882580

相关文章

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

linux如何复制文件夹并重命名

《linux如何复制文件夹并重命名》在Linux系统中,复制文件夹并重命名可以通过使用“cp”和“mv”命令来实现,使用“cp-r”命令可以递归复制整个文件夹及其子文件夹和文件,而使用“mv”命令可以... 目录linux复制文件夹并重命名我们需要使用“cp”命令来复制文件夹我们还可以结合使用“mv”命令总

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块