Debian – Dateien mit bestimmten String im Inhalt finden und löschen

System ist ein Debian Wheezy auf dem das Ziel sein soll Dateien mit einem bestimmten Inhalt / String in einem Ordner zu löschen. Genauer geschrieben ist es ein Ordner eines Dovecot IMAP Servers. Da hier nur bestimmte Dateien gelöscht werden sollen und nicht alle habe ich folgendes im Mailverzeichnis /var/mail/… durchgeführt.

Anzahl der Dateien:
# find -type f |wc -l
58080

davon Dateien mit dem Inhalt “User unknown”:
# find -type f -exec grep -q -i ‘User unknown’ ‘{}’ \; -print |wc -l
50191

Und nun das löschen all dieser Datei und noch als Boni mit der benötigten Zeit:
# time find -type f -exec grep -q -i ‘User unknown’ ‘{}’ \; -delete
real    2m41.712s
user    2m13.380s
sys     1m5.200s

Was wird hier gemacht?

time = dient der Zeitmessung und gibt uns obiges Ergebnis
find -type f = gibt  im aktuellen Verzeichnis allen Dateien zurück
exec = führt nachfolgenden Befehl, also grep ausgrep -q -i = sucht innerhalb der Datei (-q) silent in der Ausgabe und egal ob Groß- oder Kleingeschrieben (-i) nach folgendem String ‘User unknow’
‘{}’ \; = gehört zum exec und führt nachfolgenden Befehl nachgelagert wenn, der vorherige ein positives Ergebnis liefert, aus Achtung zwischen Hochkomma und Backslash ein Leerzeichen setzen
– delete = löscht entsprechend dem Ergebnis der vorherigen Abfrage und Rückgabe die Dateien

Anmerkung zum Dovecot und dem löschen von Mails. Dies ist nur dann möglich, wenn Dovecot vom Typ Maildir eingerichtet ist. Hierbei liegt jede Mail als einzelne Datei in einem entsprechendem Ordner vor. Dovecot organisiert seine Datenbank,  nach dem löschen, automatisch korrekt neu. Im Gegenzug zum Mbox, wo alle Mails in einer Datei liegen, wäre obiges so nicht möglich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.