You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于创建日期归档删除5天前日志的Bash脚本需求及问题

修复日志压缩归档脚本:按日期筛选+移动归档

我来帮你搞定这个脚本的两个核心问题——按创建/修改日期筛选要压缩的日志,以及把压缩包顺利移去归档目录,还帮你补全了错误处理和日志提示,用起来更稳妥。

完整修正脚本

#!/bin/bash

# 配置日志目录和归档目录(Windows路径用斜杠更省心,避免转义)
LOG_DIR="C:/Users/ann/logs"
ARCHIVE_DIR="${LOG_DIR}/archive"

# 先确保能进入日志目录,进不去直接报错退出
cd "$LOG_DIR" || { echo "ERROR: 无法访问日志目录 ${LOG_DIR}" >&2; exit 1; }

# 创建归档目录(不存在就自动建,多级目录也能搞定)
mkdir -p "$ARCHIVE_DIR" || { echo "ERROR: 无法创建归档目录 ${ARCHIVE_DIR}" >&2; exit 1; }

# 筛选5天内的acap前缀日志文件,逐个处理
find . -maxdepth 1 -type f -name "acap*.log*" -mtime -5 | while read -r filename; do
    # 跳过已经压缩好的.gz文件,避免重复处理
    if [[ "$filename" == *.gz ]]; then
        continue
    fi

    # 用gzip压缩文件(压缩后原文件会替换为.gz格式)
    gzip "$filename"
    compressed_file="${filename}.gz"

    # 把压缩包移去归档目录,移动失败就提示并继续下一个
    if mv "$compressed_file" "$ARCHIVE_DIR/"; then
        echo "SUCCESS: 已处理并归档 ${filename}"
    else
        echo "ERROR: 无法移动压缩文件 ${compressed_file} 到归档目录" >&2
        # 可选:如果移动失败,恢复原文件(按需打开)
        # gunzip "${compressed_file}" 2>/dev/null
    fi
done

关键修正点解释

1. 解决归档目录的问题

你之前移动失败大概率是因为归档目录不存在,脚本里加了mkdir -p "$ARCHIVE_DIR":

  • -p参数会自动创建所有不存在的父目录,哪怕archive所在的上级目录也不存在,它都会帮你建好
  • 同时加了错误判断,创建失败会直接报错退出,避免后续白忙活

2. 按日期筛选文件

把原来的遍历所有acap*.log*改成用find精准筛选:

  • -mtime -5:筛选修改时间在5天以内的文件(如果需要按创建时间,把-mtime换成-ctime就好,Windows下的Bash支持这个参数)
  • -maxdepth 1:只处理当前日志目录的文件,不会递归进子目录(如果你要处理子目录,去掉这个参数就行)
  • -type f:只处理普通文件,跳过目录或者链接文件

3. 压缩与移动的完整流程

  • 跳过已经是.gz的压缩文件,避免重复处理
  • 用gzip压缩后直接得到xxx.log.gz,然后用mv移到归档目录
  • 每个操作都加了成功/失败提示,方便你排查问题

可选调整:用tar打包压缩

如果你需要把多个日志打包成一个压缩包,或者保留原文件再手动删除,可以把压缩部分换成tar命令:

# 替换原gzip相关代码
tar -czf "${filename}.tar.gz" "$filename"
compressed_file="${filename}.tar.gz"
rm "$filename"  # 压缩完成后删除原文件

内容的提问来源于stack exchange,提问作者Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:02:20