
Ich möchte alle E-Mails in meinen IMAP-Ordnern finden, die einen bestimmten Text enthalten (nämlich: die an eine bestimmte E-Mail-Adresse gesendet wurden). Ich habe bereits herausgefunden, dass ich dies mit grep wie folgt tun kann:
grep -rnw '~/users/example' -e "[email protected]"
Dies gibt entweder den übereinstimmenden Text oder den Namen der Datei (mit -l
) zurück. Was ich für meine Aufgabe aber wirklich brauche, ist den „Titel“ der gefundenen E-Mail-Datei zu kennen.
/home/example/users/example/.Archives.2013/cur/1364614080.4080.example.com:2,Sa
/home/example/users/example/.Archives.2013/cur/1385591317.91317.example.com:2,RSa
/home/example/users/example/.Archives.2013/cur/1358235054.35054.example.com:2,S
/home/example/users/example/.Archives.2013/cur/1358445545.45545.example.com:2,S
/home/example/users/example/.Archives.2013/cur/1453119248.M330746P8611.example.com,S=6761,W=6915:2,S
Ich muss also die Dateien irgendwie basierend auf dem obigen Grep finden, aber das aufgelistete Ergebnis sollte ein anderer Teil derselben Datei sein (vielleicht mit regulärem Ausdruck?).
Wie kann ich dabei vorgehen?
Antwort1
Verwendung formail
(im Lieferumfang enthalten procmail
):
find ~/users/example -type f -exec sh -c '
for email do
formail -x to -x cc < "$email" |
grep -qF [email protected] &&
formail -cx subject < "$email"
done' sh {} +
Das heißt, für jede E-Mail-Datei
- extrahieren Sie die
To
undCc
Header - Suche
[email protected]
dort - Wenn gefunden, extrahieren Sie den
Subject
Header und drucken Sie ihn in einer Zeile (mit-c
).
Antwort2
Wie lautet der „Titel“ einer Datei, der Pfad oder Name? Verwenden Sie die Option --files-with-matches oder -l, um übereinstimmende Dateinamen aufzulisten. Wenn Sie nur nach festen Zeichenfolgen statt nach regulären Ausdrücken suchen, beschleunigen Sie den Vorgang mit -F
grep -F -r -l [email protected] ~/users/example
Um andere Inhalte der Datei abzugleichen, grepen Sie die Liste der gefundenen Dateien (fgrep ist dasselbe wie grep -F):
fgrep -rl [email protected] ~/users/example | xargs grep '^Subject:'
Hinweis: Viele Befehle beenden die Auswertung der Optionen beim ersten Argument ohne Minuszeichen. Daher sollten alle Optionen zuerst aufgerufen werden.
Antwort3
Mit mutt
:
muff -f ~/users/example/.Archives.2013
(vorausgesetzt, es handelt sich um einen Maildir-Ordner). Geben Sie innerhalb von (kleingeschriebenes ) mutt
ein .lL
Geben Sie an der Limit to messages matching:
Eingabeaufforderung Folgendes ein:
~C [email protected]
(obwohl es strenggenommen ein regulärer Ausdruck ist und daher ~C 'my@example\.com'
wörtlich .
abgeglichen werden sollte).
Oder starten Sie mutt
als:
mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'
~C
sucht in den To:
und Cc:
Kopfzeilen.
Überprüfendas Handbuchfür die Suchsyntax.
Um in mehreren Postfächern gleichzeitig zu suchen, gibt es mehrere Mail-Indexer, die Sie verwenden können (innerhalb mutt
oder außerhalb). Siehehttps://dev.mutt.org/trac/wiki/UseCases/SearchingMailzum Beispiel.