Files
ordinaceprojekt/MedicusFirebird/prune_backups.sh
T
Vladimir Buzalka 2bdac59676 notebookvb
2026-06-14 12:07:35 +02:00

63 lines
2.8 KiB
Bash

#!/bin/bash
# GFS retence PLNYCH zaloh Medicus (kazda zaloha je kompletni -> mazani ostatnich je bezpecne).
#
# SEKVENCNI, POCITANE tiery (jdou ZA sebou, neprekryvaji se), od nejnovejsiho zpet:
# 1) DENNI : poslednich 30 dni -> nech VSECHNY
# 2) TYDENNI : pak presne 8 tydnu dozadu -> z kazdeho ISO-tydne 1x (nejnovejsi = konec tydne)
# 3) MESICNI : pak presne 12 mesicu dozadu -> z kazdeho mesice 1x (nejnovejsi)
# 4) starsi : smazat
# Reference "ted" = datum NEJNOVEJSI zalohy. Datum se cte Z NAZVU MEDICUS_RRMMDD_HHMM.zip.
#
# BEZPECNOST: DRY_RUN=1 (default) jen vypisuje, NIC nemaze. DRY_RUN=0 skutecne maze.
# Neznamy/neparsovatelny nazev se NIKDY nemaze.
set -euo pipefail
BACKUP_DIR="${BACKUP_DIR:-/mnt/user/OrdinaceSynology/MedicusBackup}"
DAILY_DAYS="${DAILY_DAYS:-30}"
WEEKLY_WEEKS="${WEEKLY_WEEKS:-8}"
MONTHLY_MONTHS="${MONTHLY_MONTHS:-12}"
DRY_RUN="${DRY_RUN:-1}"
date_from_name() { local d="${1#MEDICUS_}"; d="${d:0:6}"; echo "20${d:0:2}-${d:2:2}-${d:4:2}"; }
mapfile -t FILES < <(cd "$BACKUP_DIR" && ls -1 MEDICUS_*.zip 2>/dev/null | sort -r) # nejnovejsi prvni
[ "${#FILES[@]}" -eq 0 ] && { echo "Zadne zalohy v $BACKUP_DIR"; exit 0; }
REF=$(date_from_name "${FILES[0]}")
date -d "$REF" >/dev/null 2>&1 || { echo "CHYBA: nelze precist datum z ${FILES[0]}"; exit 1; }
D_CUT=$(date -d "$REF -${DAILY_DAYS} days" +%F)
echo "REF=$REF denni>=$D_CUT, pak ${WEEKLY_WEEKS}x tydenni, pak ${MONTHLY_MONTHS}x mesicni (starsi smazat)"
declare -A KEEP seen_week seen_month
dn=0; w=0; m=0
for f in "${FILES[@]}"; do
dt=$(date_from_name "$f")
if ! date -d "$dt" >/dev/null 2>&1; then KEEP[$f]="?"; continue; fi # neparsovatelne -> ponechat
if [[ ! "$dt" < "$D_CUT" ]]; then KEEP[$f]="d"; dn=$((dn+1)); continue; fi # 1) denni (30 dni)
if [ "$w" -lt "$WEEKLY_WEEKS" ]; then # 2) tydenni (8x)
wk=$(date -d "$dt" +%G-%V)
[ -z "${seen_week[$wk]:-}" ] && { seen_week[$wk]=1; w=$((w+1)); KEEP[$f]="w"; }
continue
fi
if [ "$m" -lt "$MONTHLY_MONTHS" ]; then # 3) mesicni (12x)
mo=$(date -d "$dt" +%Y-%m)
[ -z "${seen_month[$mo]:-}" ] && { seen_month[$mo]=1; m=$((m+1)); KEEP[$f]="m"; }
continue
fi
done
mode="DRY-RUN (nic se nemaze)"; [ "$DRY_RUN" = "0" ] && mode="OSTRY (maze!)"
echo "=== GFS retence $mode | $BACKUP_DIR ==="
echo "schema: ${DAILY_DAYS}d / ${WEEKLY_WEEKS}t / ${MONTHLY_MONTHS}m | celkem: ${#FILES[@]} | ponechano: ${#KEEP[@]} (denni=$dn tydenni=$w mesicni=$m)"
del=0
for f in "${FILES[@]}"; do
if [ -n "${KEEP[$f]:-}" ]; then
printf ' KEEP [%s] %s\n' "${KEEP[$f]}" "$f"
else
printf ' DEL %s\n' "$f"; del=$((del+1))
[ "$DRY_RUN" = "0" ] && rm -f -- "$BACKUP_DIR/$f"
fi
done
echo "=== ke smazani: $del ==="