Finden Sie Dateien, die Text enthalten, aber melden Sie andere Teile davon als Ergebnis

Finden Sie Dateien, die Text enthalten, aber melden Sie andere Teile davon als Ergebnis

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 Tound CcHeader
  • Suche [email protected]dort
  • Wenn gefunden, extrahieren Sie den SubjectHeader 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 ) muttein .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 muttals:

mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'

~Csucht 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 muttoder außerhalb). Siehehttps://dev.mutt.org/trac/wiki/UseCases/SearchingMailzum Beispiel.

verwandte Informationen