#!/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"