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

Shell脚本实现双路径文件按周期压缩删除及日志记录需求咨询

脚本修改及问题解答

你的疑问解答

1. 单LOG_RETENTION变量实现30~60天文件压缩逻辑

你可以直接基于设定的LOG_RETENTION=60,在find命令的mtime参数里组合范围条件,不需要额外新增变量:

  • 大于30天用-mtime +30
  • 小于60天用-mtime -${LOG_RETENTION}
    两个条件用-a(与逻辑)拼接即可匹配30~60天区间的文件,完全只用到你定义的LOG_RETENTION一个自定义变量。如果后续需要调整保留周期,只需要改LOG_RETENTION的值,压缩区间的上限会同步更新。

2. 原有目录校验逻辑的问题

你写的if条件完全不能实现目录校验,存在几个明显错误:

  • 语法错误:if[[和]]前后都需要加空格,then前要加分号或者换行
  • 变量引用错误:/PURGE_DIR_PATH是硬编码的字符串,没有取变量值,正确的引用方式是${PURGE_DIR_PATH}
  • 多路径判断逻辑错误:PURGE_DIR_PATH里存了两个路径,不能直接用-d判断整个字符串,需要逐个遍历路径单独校验

完整可运行脚本

#!/bin/bash
# 配置项
LOG_RETENTION=60
WEB_HOME="/web/local/artifacts"
ENG_DIR="$(dirname $0)"
PURGE_DIR_PATH=("${WEB_HOME}/backup/csvs" "${WEB_HOME}/home/archives") # 改为数组存多路径更稳妥
LOG_FILE="/var/log/csv_cleanup.log" # 日志文件路径可自行修改

# 日志写入函数
write_log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}

# 开始执行打标记
write_log "===== 日志清理任务开始执行 ====="

# 目录合法性校验
for dir in "${PURGE_DIR_PATH[@]}"
do
    if [[ -d "${dir}" && -r "${dir}" && -w "${dir}" ]]; then
        write_log "目录校验通过:${dir}"
    else
        write_log "目录校验失败:${dir} 不存在或无读写权限,跳过处理"
        # 从数组中移除无效路径
        PURGE_DIR_PATH=(${PURGE_DIR_PATH[@]/${dir}})
    fi
done

# 没有有效路径直接退出
if [[ ${#PURGE_DIR_PATH[@]} -eq 0 ]]; then
    write_log "无有效待处理目录,任务退出"
    exit 1
fi

# 遍历处理每个有效目录
for dir_name in "${PURGE_DIR_PATH[@]}"
do
    write_log "开始处理目录:${dir_name}"
    # 第一步:压缩30天以上、60天以下的csv文件,跳过已压缩的gz文件
    write_log "=== 开始压缩30~${LOG_RETENTION}天的csv文件 ==="
    find "${dir_name}" -type f -name "*.csv" ! -name "*.gz" -mtime +30 -a -mtime -${LOG_RETENTION} -exec gzip {} \; -exec write_log "已压缩文件:{}" \; >> ${LOG_FILE} 2>&1
    # 第二步:删除60天以上的csv和压缩后的gz文件
    write_log "=== 开始删除${LOG_RETENTION}天以上的历史文件 ==="
    find "${dir_name}" -type f \( -name "*.csv" -o -name "*.csv.gz" \) -mtime +${LOG_RETENTION} -exec ls -l {} \; -exec rm -f {} \; -exec write_log "已删除文件:{}" \; >> ${LOG_FILE} 2>&1
done

write_log "===== 日志清理任务执行完成 ====="

脚本说明

  • 把PURGE_DIR_PATH改为数组类型存储多路径,避免空格等特殊字符导致的解析错误
  • 新增统一的日志写入函数,所有操作、校验结果、find输出都会写入指定日志文件,同时记录操作时间
  • 压缩逻辑增加了! -name "*.gz"的判断,避免重复压缩已经处理过的文件
  • 删除逻辑同时匹配原始csv和压缩后的gz文件,避免残留压缩后的历史文件
  • 所有路径引用都加了双引号,兼容带空格的路径场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 19:36:06