#!/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 ==="