notebookvb
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
#!/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 ==="
|
||||
Reference in New Issue
Block a user