initial commit

This commit is contained in:
Marco Morath 2024-08-17 22:01:37 +02:00
parent 7af9e9fff0
commit cb96ca3cb3
2 changed files with 158 additions and 0 deletions

View File

@ -1,2 +1,5 @@
# file-rentention
This script is intendet to be used to delete files, created by a backup-script for example. The rentention will be processes by a timeplan (days, weeks, months to keep).
More Information is available on the mentioned website.

155
backup-rentention.sh Normal file
View File

@ -0,0 +1,155 @@
#!/bin/bash
# Script:
# Version: 1.0
# Autor: Marco Morath
# Lizenz: Gnu GPLv3 <https://www.gnu.org/licenses/gpl-3.0.html>
# Anwenderhinweis:
# Wird der Parameter dryrun mit übergeben, wird keine Löschung durchgeführt. Es wird nur ermittelt, welche Dateien
# gelöscht werden, wenn das Skript tatsächlich ausgeführt wird.
# Verzeichnis mit den Backups
backup_dir="/mnt/backupfolder"
# Ältere Backups behalten: 14 tägliche, 13 wöchentliche, 12 monatliche
daily_keep=14
weekly_keep=13
monthly_keep=12
# Log-Verzeichnis und -Datei
log_dir="/home/user/logdirectory"
log_file="$log_dir/$(date +%Y-%m-%d)-backup-retention.log"
# Logrotation
log_files=($(ls -1tr $log_dir/*backup-retention*.log))
log_keep=14
# Alte Logdateien löschen
if [ ${#log_files[@]} -gt $log_keep ]; then
for log in "${log_files[@]:0:$((${#log_files[@]} - $log_keep))}"; do
echo "Lösche Logdatei: $log"
rm -f "$log"
done
fi
# Neues Logfile erstellen
touch "$log_file"
# Liste der Backups in umgekehrter Reihenfolge nach Erstellungsdatum (älteste zuerst)
backups=($(ls -1tr --time=ctime $backup_dir))
# Arrays für die zu behaltenden Backups
daily_backups=()
weekly_backups=()
monthly_backups=()
# Datumswerte
today_in_seconds=$(date +%s)
daily_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * $daily_keep ) ))
weekly_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * 7 * $weekly_keep ) ))
monthly_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * 30 * $monthly_keep ) ))
# Funktion, um die Woche eines Datums zu berechnen
get_week_of_year() {
date -d "@$1" +%Y-%V
}
# Funktion, um den Monat eines Datums zu berechnen
get_month_of_year() {
date -d "@$1" +%Y-%m
}
# Backup-Kategorisierung
declare -A weekly_latest
declare -A monthly_latest
for backup in "${backups[@]}"; do
backup_date_seconds=$(stat -c %Y "$backup_dir/$backup")
if [ $backup_date_seconds -ge $daily_oldest_in_seconds ]; then
daily_backups+=($backup)
elif [ $backup_date_seconds -ge $weekly_oldest_in_seconds ]; then
week_of_year=$(get_week_of_year $backup_date_seconds)
if [[ -z "${weekly_latest[$week_of_year]}" || $backup_date_seconds -gt $(stat -c %Y "$backup_dir/${weekly_latest[$week_of_year]}") ]]; then
weekly_latest[$week_of_year]=$backup
fi
elif [ $backup_date_seconds -ge $monthly_oldest_in_seconds ]; then
month_of_year=$(get_month_of_year $backup_date_seconds)
if [[ -z "${monthly_latest[$month_of_year]}" || $backup_date_seconds -gt $(stat -c %Y "$backup_dir/${monthly_latest[$month_of_year]}") ]]; then
monthly_latest[$month_of_year]=$backup
fi
fi
done
# Jüngste wöchentliche und monatliche Backups in Arrays speichern
for backup in "${weekly_latest[@]}"; do
weekly_backups+=($backup)
done
for backup in "${monthly_latest[@]}"; do
monthly_backups+=($backup)
done
# Alle zu behaltenden Backups zusammenführen
keep_backups=("${daily_backups[@]}" "${weekly_backups[@]}" "${monthly_backups[@]}")
# Funktion zum Protokollieren
log() {
echo "$1" | tee -a "$log_file"
}
# Beginn des Vorgangs dokumentieren
log "##### Bereinigung begonnen ( $(date +"%d-%m-%Y %H:%M:%S") ) #####"
# Überprüfen, ob der Parameter "dryrun" gesetzt ist
dryrun=false
if [ "$1" == "dryrun" ]; then
dryrun=true
log "Dry run aktiviert: Es werden keine Backups gelöscht."
fi
# Backups zum Behalten ermitteln
echo "==== Zu behaltende Backups ===="
number=0
for backup in "${backups[@]}"; do
if [[ " ${keep_backups[@]} " =~ " $backup " ]]; then
number=$(($number+1))
if $dryrun; then
log "$number Würde behalten: $backup"
else
log "$number Behalte Backup: $backup"
fi
fi
done
# Backups zum Löschen ermitteln
echo "==== Zu löschende Backups ===="
number=0
for backup in "${backups[@]}"; do
if [[ ! " ${keep_backups[@]} " =~ " $backup " ]]; then
number=$(($number+1))
if $dryrun; then
log "$number Würde löschen: $backup"
else
log "$number Lösche Backup: $backup"
rm -f "$backup_dir/$backup"
fi
fi
done
log "##### Backup-Bereinigung abgeschlossen ( $(date +"%d-%m-%Y %H:%M:%S") ) #####"