# 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.