Nachdem ich 80'000 Emails in meinen Posteingang verschoben hatte, wollte ich in Usermin per Filterregel diese Mails in verschiedene Ordner sortieren.
Das kopieren ging auch relativ flott, allerdings ging das Löschen aus dem Posteingang irgendwie nicht wirklich vorwärts.
Die Mails wurden anscheinend nicht einfach verschoben sondern kopiert weshalb ich mit tausenden von doppelten Mails in meinem Posteingang konfrontiert war.
Das ganze manuell zu säubern war offensichtlich nicht praktikabel weshalb ich mich auf die Suche nach anderen Möglichkeiten machte.
Am Ende habe ich es dann mit Hilfe von 2-3 Befehlen geschaft.
Diese will ich hier nun auflisten falls ich wieder mal in diese Situation komme.
Achtung: das funktioniert nur wenn man physischen Zugriff auf den Mailserver hat und mit Maildir arbeitet!
Als erstes erstelle ich ein Backup des Accounts:
rsync -av --progress /path/to/homes/account/ /path/to/homes/account_backup/
Falls man den Vorgang für verschiedene Ordner wiederholen muss kann man auch noch die option --delete
anfügen. Und vielleicht vorher noch einen --dry-run
machen.
Dann erstelle ich eine Liste aller Mails im Posteingang:
find /path/to/homes/account/Maildir/{new,cur} -type f -exec grep -m1 -i "^Message-ID:" {} \; -print > /tmp/inbox_msgids.txt
Und nun von dem Ordner in den die Mails bereits kopiert wurden:
find /path/to/homes/account/Maildir/.INBOX.subdir/{new,cur} -type f -exec grep -m1 -i "^Message-ID:" {} \; -print > /tmp/subdir_msgids.txt
Anschliessend vergleiche ich die beiden Dateien und lasse die Email-Dateien in eine weitere Datei schreiben.
Die Emails werden in den Dateien jeweils mit
Message ID: {message-id}
Dateiname
erfasst, weshalb ich die 1. Zeile matche und die 2. Zeile in die neue Datei schreibe.
awk '
NR==FNR { if (NR % 2 == 1) id[$0]; next }
NR % 2 == 1 && ($0 in id) { getline; print $0 }
' /tmp/subdir_msgids.txt /tmp/inbox_msgids.txt > /tmp/duplicate_files.txt
Nun kann ich alle Dateien in der duplicate_files.txt
löschen:
xargs rm -f < /tmp/duplicate_files.txt
Damit waren dann alle Mails im Posteingang gelöscht.
Falls irgendetwas schiefgelaufen ist, kann man mit
rsync -av --progress /path/to/homes/account_backup/ /path/to/homes/account/
einfach alles wieder zurückspielen und nochmal versuchen.