106 lines
3.0 KiB
Bash
Executable File
106 lines
3.0 KiB
Bash
Executable File
#!/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"
|