CentOS 上 LibreOffice 备份策略
一 备份范围与原则
二 工具与命令示例
三 推荐备份策略与保留
四 恢复流程与验证
五 自动化脚本与注意事项
#!/usr/bin/env bash
set -Eeuo pipefail
SRC_DIR="$HOME/Documents/liboffice"
BACKUP_BASE="$HOME/Backup/liboffice"
LOG_FILE="$BACKUP_BASE/backup_libreoffice.log"
DATE=$(date +%F)
WEEK_DAY=$(date +%u) # 1-7, Monday=1
KEEP_DAYS=7
KEEP_WEEKS=4
KEEP_MONTHS=12
mkdir -p "$BACKUP_BASE"
log() {
echo "$(date '+%F %T') $*" | tee -a "$LOG_FILE"
}
# 0 2 * * * daily rsync incremental
do_rsync() {
local DST="$BACKUP_BASE/incr/$DATE"
mkdir -p "$DST"
rsync -a -v --delete "$SRC_DIR/" "$DST/" >> "$LOG_FILE" 2>&1
log "RSYNC incremental -> $DST"
}
# 0 3 * * 0 weekly full tar
do_tar_full() {
local ARC="$BACKUP_BASE/full/liboffice_full_$DATE.tar.gz"
mkdir -p "$(dirname "$ARC")"
tar -c -z -f "$ARC" -C "$SRC_DIR" . >> "$LOG_FILE" 2>&1
log "TAR full -> $ARC"
}
# retention: days/weeks/months
do_retention() {
# daily
find "$BACKUP_BASE/incr" -maxdepth 1 -type d -mtime +$KEEP_DAYS -print0 | xargs -0 rm -rf
# weekly: keep last KEEP_WEEKS Sundays
find "$BACKUP_BASE/full" -maxdepth 1 -name 'liboffice_full_*.tar.gz' -print0 \
| xargs -0 stat -c '%Y %n' \
| sort -nr \
| tail -n +$((KEEP_WEEKS+1)) \
| cut -d' ' -f2- \
| xargs -r rm -f
# monthly: keep last KEEP_MONTHS
find "$BACKUP_BASE/full" -maxdepth 1 -name 'liboffice_full_*.tar.gz' -print0 \
| xargs -0 basename -a \
| sed 's/.*_\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)\.tar\.gz/\1 \0/' \
| sort -k1,1 -r \
| awk -v keep="$KEEP_MONTHS" '!seen[$2]++ {n++; if (n>keep) print $2}' \
| xargs -r rm -f
log "Retention applied: days=$KEEP_DAYS weeks=$KEEP_WEEKS months=$KEEP_MONTHS"
}
main() {
log "=== Backup start ==="
do_rsync
if [[ "$WEEK_DAY" -eq 7 ]]; then
do_tar_full
fi
do_retention
log "=== Backup end ==="
}
main "$@"