#!/bin/bash
# 日志备份和压缩脚本
# 每天执行:备份昨天的日志
# 每周日执行:压缩上周的备份日志
set -e
# 配置参数
LOG_DIR="/logs/demo"
BACKUP_DIR="${LOG_DIR}/backup"
# 创建目录
mkdir -p ${BACKUP_DIR}
mkdir -p ${BACKUP_DIR}/weekly
# 获取日期
YESTERDAY=$(date -d "yesterday" +"%Y-%m-%d")
TODAY=$(date +"%Y-%m-%d")
DAY_OF_WEEK=$(date +"%u") # 1=Monday, 7=Sunday
# 设置没有匹配时返回空数组(用于通配符匹配文件)
shopt -s nullglob
echo "[${TODAY}] 开始处理日志备份..."
# 1. 备份昨天的日志文件
cd ${LOG_DIR}
SOURCE_FILE=(*-"${YESTERDAY}".*.log)
if [ ${#SOURCE_FILE[@]} -gt 0 ]; then
echo "备份昨日日志: ${SOURCE_FILE[@]} -> ${BACKUP_DIR}"
cp -p ${SOURCE_FILE[@]} ${BACKUP_DIR}
echo "[${TODAY}] 日志备份完成."
else
echo "昨天[${YESTERDAY}]没有日志文件"
fi
# 2. 如果是周日(每周一次),压缩上周的备份日志
if [ "${DAY_OF_WEEK}" -eq 7 ]; then
echo "今天是周日,执行每周压缩..."
# 获取上周的日期范围
LAST_WEEK_START=$(date -d "7 days ago" +"%Y-%m-%d")
LAST_WEEK_END=$(date -d "1 day ago" +"%Y-%m-%d")
# 创建压缩包文件名
COMPRESS_FILE="${BACKUP_DIR}/weekly/demo-${LAST_WEEK_START}-to-${LAST_WEEK_END}.tar.gz"
# 收集上周的所有备份日志文件
cd ${BACKUP_DIR}
FILES_TO_COMPRESS=()
for i in {1..7}; do
DATE=$(date -d "${i} days ago" +"%Y-%m-%d")
# 查找该日期的所有日志文件
MATCHED_FILES=(*-"${DATE}".*.log)
if [ ${#MATCHED_FILES[@]} -gt 0 ]; then
FILES_TO_COMPRESS+=("${MATCHED_FILES[@]}")
fi
done
echo "压缩上周日志: ${FILES_TO_COMPRESS[@]}"
tar -czf ${COMPRESS_FILE} "${FILES_TO_COMPRESS[@]}"
echo "压缩完成."
fi