From 1420bcb4e0f21fc2fa8a5c7820b085e232f507fa Mon Sep 17 00:00:00 2001 From: Christoph Date: Mon, 9 Nov 2026 12:06:37 +0100 Subject: [PATCH] Add scripts 'show-deleted-mailboxes.sh' and 'show-deleted-maildomains.sh'. --- show-deleted-mailboxes.sh | 105 ++++++++++++++++++++++++++++++++++++ show-deleted-maildomains.sh | 84 +++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100755 show-deleted-mailboxes.sh create mode 100755 show-deleted-maildomains.sh diff --git a/show-deleted-mailboxes.sh b/show-deleted-mailboxes.sh new file mode 100755 index 0000000..6493c34 --- /dev/null +++ b/show-deleted-mailboxes.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +# Gelöschte Mailboxen nach Maildomain auflisten. +standardverzeichnis=/var/deleted-maildirs +printf '\nBasisverzeichnis [%s]: ' "$standardverzeichnis" >&2 +IFS= read -r basisverzeichnis || exit 1 +basisverzeichnis=${basisverzeichnis:-$standardverzeichnis} + +# Auch einen eingegebenen Pfad wie ~/mailbackup unterstützen. +case $basisverzeichnis in + '~') basisverzeichnis=$HOME ;; + '~/'*) basisverzeichnis=$HOME/${basisverzeichnis:2} ;; +esac + +if [[ ! -d $basisverzeichnis || ! -r $basisverzeichnis || ! -x $basisverzeichnis ]]; then + printf 'Basisverzeichnis ist nicht lesbar oder nicht zugänglich: %s\n' \ + "$basisverzeichnis" >&2 + exit 1 +fi + +shopt -s nullglob +status=0 +gesamtbytes=0 +namensbreite=0 +groessenbreite=0 +namen=() +loeschdaten=() +groessen=() +domains=() + +verzeichnisse=() +for domainverzeichnis in "${basisverzeichnis%/}"/*/; do + if [[ ! -r $domainverzeichnis || ! -x $domainverzeichnis ]]; then + printf 'Domainverzeichnis ist nicht zugänglich: %s\n' "$domainverzeichnis" >&2 + status=1 + continue + fi + verzeichnisse+=("${domainverzeichnis%/}"/*/) +done + +muster='^([0-9]{4}-[0-9]{2}-[0-9]{2})_([0-9]{2})-([0-9]{2})_(.+)$' +for verzeichnis in "${verzeichnisse[@]}"; do + pfad=${verzeichnis%/} + [[ ${pfad##*/} =~ $muster ]] || continue + + name=${BASH_REMATCH[4]} + namen+=("$name") + loeschdaten+=("${BASH_REMATCH[1]} ${BASH_REMATCH[2]}:${BASH_REMATCH[3]}") + domainpfad=${pfad%/*} + domains+=("${domainpfad##*/}") + + # Belegte Bytes addieren und erst für die Ausgabe formatieren. + if groessenzeile=$(du -s -B1 -- "$verzeichnis"); then + bytes=${groessenzeile%%$'\t'*} + gesamtbytes=$(( gesamtbytes + bytes )) + groesse=$(numfmt --to=iec "$bytes") + else + groesse='?' + status=1 + fi + groessen+=("$groesse") + + if (( ${#name} > namensbreite )); then + namensbreite=${#name} + fi + if (( ${#groesse} > groessenbreite )); then + groessenbreite=${#groesse} + fi +done + +printf '\n' +if (( ${#namen[@]} == 0 )); then + zeile='Keine passenden Unterverzeichnisse gefunden.' + printf '%s\n' "$zeile" +else + letzte_domain='' + for index in "${!namen[@]}"; do + domain=${domains[index]} + if [[ $domain != "$letzte_domain" ]]; then + if [[ -n $letzte_domain ]]; then + printf '\n' + fi + printf '%s\n' "$domain" + printf '%*s\n' "${#domain}" '' | tr ' ' '-' + letzte_domain=$domain + fi + name=${namen[index]} + padding=$(( namensbreite - ${#name} )) + printf -v zeile 'Mailbox: %s%*s Löschdatum: %s - Größe: %*s' \ + "$name" "$padding" '' "${loeschdaten[index]}" \ + "$groessenbreite" "${groessen[index]}" + printf '%s\n' "$zeile" + done +fi + +printf '\n\n' +printf '%*s\n' "${#zeile}" '' | tr ' ' '=' + +gesamtgroesse=$(numfmt --to=iec "$gesamtbytes") +printf 'Gesamtgröße: %s' "$gesamtgroesse" +if (( status != 0 )); then + printf ' (unvollständig)' +fi +printf '\n\n' +exit "$status" diff --git a/show-deleted-maildomains.sh b/show-deleted-maildomains.sh new file mode 100755 index 0000000..26cf25b --- /dev/null +++ b/show-deleted-maildomains.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash + +# Gelöschte Maildomains auflisten. +standardverzeichnis=/var/deleted-maildomains +printf '\nBasisverzeichnis [%s]: ' "$standardverzeichnis" >&2 +IFS= read -r basisverzeichnis || exit 1 +basisverzeichnis=${basisverzeichnis:-$standardverzeichnis} + +# Auch einen eingegebenen Pfad wie ~/mailbackup unterstützen. +case $basisverzeichnis in + '~') basisverzeichnis=$HOME ;; + '~/'*) basisverzeichnis=$HOME/${basisverzeichnis:2} ;; +esac + +if [[ ! -d $basisverzeichnis || ! -r $basisverzeichnis || ! -x $basisverzeichnis ]]; then + printf 'Basisverzeichnis ist nicht lesbar oder nicht zugänglich: %s\n' \ + "$basisverzeichnis" >&2 + exit 1 +fi + +shopt -s nullglob +status=0 +gesamtbytes=0 +namensbreite=0 +groessenbreite=0 +namen=() +loeschdaten=() +groessen=() + +verzeichnisse=("${basisverzeichnis%/}"/*/) + +muster='^([0-9]{4}-[0-9]{2}-[0-9]{2})_([0-9]{2})-([0-9]{2})_(.+)$' +for verzeichnis in "${verzeichnisse[@]}"; do + pfad=${verzeichnis%/} + [[ ${pfad##*/} =~ $muster ]] || continue + + name=${BASH_REMATCH[4]} + namen+=("$name") + loeschdaten+=("${BASH_REMATCH[1]} ${BASH_REMATCH[2]}:${BASH_REMATCH[3]}") + + # Belegte Bytes addieren und erst für die Ausgabe formatieren. + if groessenzeile=$(du -s -B1 -- "$verzeichnis"); then + bytes=${groessenzeile%%$'\t'*} + gesamtbytes=$(( gesamtbytes + bytes )) + groesse=$(numfmt --to=iec "$bytes") + else + groesse='?' + status=1 + fi + groessen+=("$groesse") + + if (( ${#name} > namensbreite )); then + namensbreite=${#name} + fi + if (( ${#groesse} > groessenbreite )); then + groessenbreite=${#groesse} + fi +done + +printf '\n' +if (( ${#namen[@]} == 0 )); then + zeile='Keine passenden Unterverzeichnisse gefunden.' + printf '%s\n' "$zeile" +else + for index in "${!namen[@]}"; do + name=${namen[index]} + padding=$(( namensbreite - ${#name} )) + printf -v zeile 'Maildomain: %s%*s Löschdatum: %s - Größe: %*s' \ + "$name" "$padding" '' "${loeschdaten[index]}" \ + "$groessenbreite" "${groessen[index]}" + printf '%s\n' "$zeile" + done +fi + +printf '\n' +printf '%*s\n' "${#zeile}" '' | tr ' ' '=' + +gesamtgroesse=$(numfmt --to=iec "$gesamtbytes") +printf 'Gesamtgröße: %s' "$gesamtgroesse" +if (( status != 0 )); then + printf ' (unvollständig)' +fi +printf '\n\n' +exit "$status"