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
相关产品推荐
相关产品推荐

