基于创建日期归档删除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
相关产品推荐
相关产品推荐

