diff --git a/konsolidieren.md b/konsolidieren.md new file mode 100644 index 0000000..7b0408a --- /dev/null +++ b/konsolidieren.md @@ -0,0 +1,121 @@ +# Archiv-Konsolidierung ([konsolidierung.sh](http://konsolidierung.sh)) + +## Zweck + +Das Skript ergänzt ein rsync-/rclone-Backup mit Archiv-Ordner um eine automatische +Lösch- bzw. Verdichtungs-Strategie. Aus den pro Backup-Lauf entstandenen Archiv-Ordnern + +``` +Archiv/ +├── 2026-07-01-06/ +├── 2026-07-15-14/ +├── 2026-08-03-14/ +└── ... +``` + +werden automatisch verdichtete Strukturen: + +1. **Monatsordner**: Alle Tages-Ordner (`JJJJ-MM-TT-HH`) eines abgelaufenen Monats + werden zu einem Ordner `JJJJ-MM` zusammengefasst. +2. **Jahresordner**: Monatsordner, die älter als `RETAIN_MONTHS` (Standard: 3) Monate + sind, werden zu einem Ordner `JJJJ` zusammengefasst. + +Der aktuelle Monat und die jüngsten Monatsordner bleiben unverändert bestehen. + +## Konsolidierungsregel + +Beim Zusammenführen mehrerer Ordner gilt: **Die aktuellste Version einer Datei bleibt** +**erhalten**, ältere Varianten werden überschrieben. Dateien, die nur in älteren Läufen +vorlagen (z. B. weil sie zwischenzeitlich im Produktiv-Bestand gelöscht und deshalb +archiviert wurden), bleiben unangetastet erhalten – das Skript löscht beim Merge +niemals etwas im Ziel, es überschreibt nur. + +Das bedeutet für den Lebenszyklus einer Datei: + + +| Situation | Ergebnis nach Konsolidierung | +| ---------------------------------------- | ------------------------------------------ | +| Datei in mehreren Läufen unverändert | eine Kopie (neueste Version) | +| Datei zwischen Läufen verändert | letzte Version, ältere Varianten entfallen | +| Datei gelöscht und ins Archiv verschoben | bleibt dauerhaft erhalten | +| Datei nie archiviert | nicht betroffen | + + +## Nutzung + +```bash +bash konsolidierung.sh [-n] +``` + + +| Option | Bedeutung | +| ---------------------- | ------------------------------------------------------------ | +| `-n` | Dry-Run: zeigt nur an, was passieren würde, verändert nichts | +| `` | Pfad zum Archiv (Pflichtangabe) | + + +Beispiele: + +```bash +bash konsolidierung.sh -n Archiv/ # Vorschau +bash konsolidierung.sh Archiv/ # ausführen +``` + +## Konfiguration + +Die Variablen stehen am Anfang des Skripts: + +- `RETAIN_MONTHS=3` – Monatsordner jünger als dieser Wert (in Monaten, bezogen auf +heute) bleiben als Monatsordner bestehen. Ältere wandern in den Jahresordner. +- `LOG_FILE=""` – leer lassen für reine Terminal-Ausgabe, oder einen Pfad setzen, +um alle Meldungen zusätzlich in ein Logfile zu schreiben (Append-Modus): + ```bash + LOG_FILE="/var/log/konsolidierung.log" + ``` + +## Logging + +Jede verarbeitete Aktion wird mit Zeitstempel protokolliert: + +```text +[2026-09-28 14:32:05] mv: /pfad/Archiv/2026-08-01-06 -> /pfad/Archiv/2026-08 (Grundordner fuer 2026-08) +[2026-09-28 14:32:07] merge: /pfad/Archiv/2026-08-03-14 -> /pfad/Archiv/2026-08 +``` + +Bei gesetztem `LOG_FILE` landen dieselben Zeilen zusätzlich im Logfile. Da im +Append-Modus geschrieben wird, eignet sich das Log als lückenlose Historie der +Konsolidierungen. + +## Wann und wie oft laufen lassen? + +Das Skript kann **beliebig oft** laufen, idealerweise täglich direkt im Anschluss an +den Backup-Sync. Es ist idempotent: + +- Ordner des aktuellen Monats werden nie angefasst; erst nach Monatswechsel werden +die Ordner des Vormonats zusammengefasst. +- Ein erneuter Lauf ohne neue abgelaufene Monate bewirkt schlicht nichts. +- Wird ein Lauf unterbrochen, setzt der nächste Lauf die Zusammenführung fort +(Restordner werden in den bereits bestehenden Monats-/Jahresordner weiter gemergt). + +Einbindung in die tägliche Backup-Routine, z. B. per Cron: + +```cron +30 2 * * * /pfad/backup-sync.sh && /pfad/konsolidierung.sh /pfad/Archiv +``` + +## Sicherheitshinweise + +- **Erst testen**: vor dem ersten echten Lauf `bash konsolidierung.sh -n Archiv/` +ausführen und die Ausgabe prüfen. +- Ordner, die nicht dem Namensmuster `JJJJ-MM-TT-HH` bzw. `JJJJ-MM` entsprechen, +werden ignoriert und nie verändert. +- Da beim Merge kopiert (`cp -a`, erhält Rechte und Zeitstempel) und erst danach +gelöscht wird, ist ein Abbruch unkritisch; es können nur Restkopien entstehen, +die der nächste Lauf aufräumt. +- Das Skript sollte nicht gleichzeitig mit dem Backup-Sync auf dasselbe Archiv +laufen (einfach sequenziell aufrufen). + +## Voraussetzungen + +- Linux mit Bash (nutzt `date -d`, `mapfile`, assoziative Arrays). +- Das Archiv-Verzeichnis muss für den ausführenden Nutzer schreibbar sein. \ No newline at end of file