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-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念