当前位置: 首页 > news >正文

脚本:记录:保留最近俩月的log日志并删除剩余的全部log

#!/bin/bash
# 脚本说明:保留最近N个月的log日志并删除剩余的全部log

# 暂时注释掉set -e以便调试
# set -euo pipefail

# 配置参数
#MONTHS_TO_KEEP等于几,就代表保留从现在开始往前数几个月的日志文件
MONTHS_TO_KEEP=2
#默认检查删除的是当前目录的日志文件,可以修改为这里的".“为其他目录,建议脚本
#在需要删除的日志文件的同级目录下执行,保证不会删错其他文件
LOG_DIR=”."
#日志文件的模式可以在这里继续新增
LOG_PATTERNS=(“*.log” “*.log.*” “*_log” “*_log.*” “*log*”)

# 计算保留的起始日期(时间戳)
start_timestamp=$(date -d “${MONTHS_TO_KEEP} months ago” +%s)
start_date=$(date -d “${MONTHS_TO_KEEP} months ago” +%Y-%m-%d)
echo “保留从 $start_date 开始的日志文件”
echo “当前时间: $(date +%Y-%m-%d)”
echo “========================================”

files_to_delete=()
files_to_keep=()

# 扩展的日期模式匹配函数
extract_date_from_filename() {
    local filename=“$1”
    local date_str=“”

# 尝试多种日期格式
# 格式1: YYYY-MM-DD, YYYY_MM_DD, YYYY.MM.DD
    if [[ “$filename” =~ ([0-9]{4})[-_.]([0-9]{2})[-_.]([0-9]{2}) ]]; then
        date_str=“${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}”

# 格式2: YYYYMMDD
    elif [[ “$filename” =~ ([0-9]{4})([0-9]{2})([0-9]{2}) ]]; then
        date_str=“${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}”

# 格式3: YY-MM-DD (2位年份)
    elif [[ “$filename” =~ ([0-9]{2})[-_.]([0-9]{2})[-_.]([0-9]{2}) ]]; then
        year=“20${BASH_REMATCH[1]}”
        date_str=“${year}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}”

# 格式4: 只有年月 YYYY-MM
    elif [[ “$filename” =~ ([0-9]{4})[-_.]([0-9]{2})([^0-9]|$) ]]; then
        date_str=“${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-01”

# 格式5: 日志轮转格式 (YYYY-MM-DD-HHMMSS)
    elif [[ “$filename” =~ ([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{6}) ]]; then
        date_str=“${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]}”
    fi

    echo “$date_str”
}

# 遍历目录下的所有文件
for file in “$LOG_DIR”/*; do
# 跳过目录和非普通文件
    [ ! -f “$file” ] && continue

    filename=$(basename “$file”)

# 检查是否是日志文件(根据扩展名或名称)
    is_log_file=false
    for pattern in “${LOG_PATTERNS[@]}”; do
        if [[ “$filename” == $pattern ]] ||
           [[ “$filename” =~ \.(log|LOG|gz|zip|tar)$ ]] ||
           [[ “$filename” =~ log ]] ||
           [[ “$filename” =~ LOG ]]; then
            is_log_file=true
            break
        fi
    done

    if [ “$is_log_file” = false ]; then
        continue
    fi
# 从文件名提取日期
    date_str=$(extract_date_from_filename “$filename”)

    if [ -n “$date_str” ]; then
# 将日期转换为时间戳进行比较
        if file_timestamp=$(date -d “$date_str” +%s 2>/dev/null); then
            if [ “$file_timestamp” -lt “$start_timestamp” ]; then
                files_to_delete+=(“$file”)
                echo “删除: $filename ($date_str)”
            else
                files_to_keep+=(“$file”)
                echo “保留: $filename ($date_str)”
            fi
        else
            echo “无法解析日期: $filename ($date_str) - 将保留”
            files_to_keep+=(“$file”)
        fi
    else
        echo “无日期信息: $filename - 将保留”
        files_to_keep+=(“$file”)
    fi
done

echo “======================================================”
echo “统计信息:”
echo " 日志文件总数: $((${#files_to_delete[@]} + ${#files_to_keep[@]}))"
echo " 需要删除: ${#files_to_delete[@]}"
echo " 需要保留: ${#files_to_keep[@]}"

# 如果没有文件可删除
if [ ${#files_to_delete[@]} -eq 0 ]; then
    echo “”
    echo “没有需要删除的日志文件。”
    exit 0
fi

echo “”
echo “找到 ${#files_to_delete[@]} 个需要删除的文件:”
for file in “${files_to_delete[@]}”; do
    filename=$(basename “$file”)
    date_str=$(extract_date_from_filename “$filename”)
    if [ -n “$date_str” ]; then
        human_date=$(date -d “$date_str” “+%Y-%m-%d” 2>/dev/null || echo “$date_str”)
        echo " $filename ($human_date)"
    else
        echo " $filename"
    fi
done

echo “======================================================”
echo “统计信息:”
echo " 日志文件总数: $((${#files_to_delete[@]} + ${#files_to_keep[@]}))"
echo " 需要删除: ${#files_to_delete[@]}"
echo " 需要保留: ${#files_to_keep[@]}"

# 确认删除
echo “”
read -p "确认删除上述文件?(y/N): " confirm
if [[ “${confirm,}” == “y” ]]; then
    deleted_count=0
    failed_count=0
    failed_files=()

    for file in “${files_to_delete[@]}”; do
        echo “正在删除: ‘$file’”
        echo " 文件存在吗?"
        if [ -f “$file” ]; then
            echo " 是,文件存在"
            echo " 权限信息:"
            ls -la “$file” || echo " 无法获取文件信息"
            echo " 尝试删除…"
            if rm -f “$file”; then
                echo " 删除成功!"
                ((deleted_count++))
            else
                echo " 删除失败,错误码: $?"
                ((failed_count++))
                failed_files+=(“$file”)
            fi
        else
            echo " 否,文件不存在"
            ((failed_count++))
            failed_files+=(“$file”)
        fi
        echo " —"
    done
    echo “”
    echo “删除完成!”
    echo “已删除 $deleted_count 个文件”

    if [ $failed_count -gt 0 ]; then
        echo “删除失败 $failed_count 个文件:”
        for failed_file in “${failed_files[@]}”; do
            echo " ‘$failed_file’"
        done
    fi
else
    echo “操作取消”
fi

http://www.jsqmd.com/news/417483/

相关文章:

  • 2026NMN十大品牌排行榜:NMN哪个品牌效果最好?只做靠谱的NMN品牌推荐 - 速递信息
  • Prompt Engineering:与大模型高效对话的艺术
  • 2026成都太阳能发电厂商测评:契宏科技深耕光伏领域专业度拉满 - 深度智识库
  • 巡检PG数据库
  • 安装keil的注意
  • 一次生产事故复盘:服务报 “Failed to obtain JDBC Connection” 的完整排查与解决
  • 2026最新精装房装修企业优选指南 五大品质品牌参考 - 十大品牌榜
  • 2026年适合小规模企业的五款高效财务软件推荐 - 速递信息
  • Delphi cxgrid设置OnFocusedRecordChanged 事件导致内存泄露.
  • 年游客破300万!文旅灯光如何激活千年古桥的夜经济? - 速递信息
  • P15441 [蓝桥杯 2025 国 Python/Java 研究生组] 耗时最短的路径
  • Vue3 Hooks 对比 Vue2 Mixins 两者之间的区别?
  • 2026年香薰市场风向标:哪些蜡烛OEM公司值得关注,香薰纸片/天然植物精油香氛/别墅香氛,香薰ODM公司推荐排行榜 - 品牌推荐师
  • 简单理解:文档类型doc 和 docx的区别
  • 工业脱碳:Calderion、WenCo和Terravent投资Graforce,推动等离子体热解技术全球规模化应用
  • 2026天津国际高中哪家强?5所热门学校与升学率高的国际高中推荐 - 品牌2025
  • 2026金华义乌AI优化服务商TOP4权威评测:品牌智能化增长优选指南 - 呼呼拉呼
  • 2026年推荐治疗心脏瓣膜疾病的医院参考 - 品牌排行榜
  • Spring全家桶全彩学习进阶笔记(终极版)
  • 《百度最新财报:2025年营收1291亿元 四季度AI业务收入占比43%》
  • 电天下搜索列表数据接口深度实战:AI搜索协议+会员权限+电力数据合规方案
  • Black Hat Asia 2026将揭晓有关人工智能威胁与供应链漏洞的突破性研究成果
  • impression?
  • 2026年天津国际高中推荐汇总,天津国际高中怎么选及比较知名的天津国际高中一览 - 品牌2025
  • 专科生收藏!千笔,口碑爆棚的AI论文网站
  • 工正主流RIP适配UV导带机推荐,有哪些优势? - 工业品网
  • 2026推荐上海主动脉夹层治疗的医院有哪些? - 品牌排行榜
  • 2026年逆流式冷却塔填料/浊环水循环/网格填料/网格板厂家优选: 济源市灵辉环保科技专注工业冷却核心组件 - 品牌推荐官
  • 总结北京瓷砖品牌,哪家瓷砖定制厂家的服务和性价比更高? - 工业推荐榜
  • 【软件】NFS部署