
Quiero encontrar todos los correos electrónicos en mis carpetas IMAP que contienen un texto determinado (es decir, que se envían a una dirección de correo electrónico determinada). Ya descubrí que puedo hacerlo usando grep de esta manera:
grep -rnw '~/users/example' -e "[email protected]"
Esto devuelve el texto coincidente o el nombre del archivo (con -l
). Pero lo que realmente necesito para mi tarea es saber el "Título" del archivo de correo electrónico que se encontró.
/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
Entonces, de alguna manera necesito encontrar los archivos basados en el grep anterior, pero el resultado que aparece debería ser una parte diferente de ese mismo archivo (¿tal vez con expresiones regulares?).
¿Cómo puedo hacer esto?
Respuesta1
Usando formail
(enviado con 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 {} +
Es decir, para cada archivo de correo electrónico
- extraer los encabezados
To
yCc
- busca
[email protected]
ahí dentro - si lo encuentra, extraiga el
Subject
encabezado e imprímalo en una línea (con-c
).
Respuesta2
¿Qué es el "Título" de un archivo, la ruta o el nombre? Utilice la opción --files-with-matches o -l para enumerar los nombres de archivos coincidentes. Si busca solo cadenas fijas en lugar de expresiones regulares, acelere el proceso con -F
grep -F -r -l [email protected] ~/users/example
Haga coincidir otro contenido del archivo, grep la lista de archivos encontrados (fgrep es lo mismo que grep -F):
fgrep -rl [email protected] ~/users/example | xargs grep '^Subject:'
Sugerencia: muchos comandos detiene el análisis de opciones en el primer argumento sin carácter menos. Por lo tanto, todas las opciones deben llamarse primero.
Respuesta3
Con mutt
:
muff -f ~/users/example/.Archives.2013
(suponiendo que sea una carpeta maildir). Y dentro mutt
, escribe l(minúscula L
).
Cuando Limit to messages matching:
se le solicite, ingrese:
~C [email protected]
(aunque estrictamente hablando, como es una expresión regular, debería ~C 'my@example\.com'
coincidir .
literalmente).
O empezar mutt
como:
mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'
~C
busca en los encabezados To:
y Cc:
.
Controlarel manualpara la sintaxis de búsqueda.
Para buscar en más de un buzón a la vez, existen varios indexadores de correo que puede utilizar (dentro mutt
o no). Verhttps://dev.mutt.org/trac/wiki/UseCases/SearchingMailpor ejemplo.