63 lines
2.8 KiB
Bash
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 ==="
|