
Quero encontrar todos os emails nas minhas pastas IMAP que contenham um determinado texto (ou seja: que sejam enviados para um determinado endereço de email). Eu já descobri que posso fazer isso usando grep assim:
grep -rnw '~/users/example' -e "[email protected]"
Isso retorna o texto correspondente ou o nome do arquivo (com -l
). Mas o que eu realmente preciso para minha tarefa é saber o “Título” do arquivo de email que foi encontrado.
/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
Então, de alguma forma, preciso encontrar os arquivos com base no grep acima, mas o resultado listado deve ser uma parte diferente do mesmo arquivo (talvez com regex?).
Como posso fazer isso?
Responder1
Usando formail
(enviado com 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 {} +
Ou seja, para cada arquivo de email
- extraia os cabeçalhos
To
eCc
- procure
[email protected]
lá - se encontrado, extraia o
Subject
cabeçalho e imprima-o em uma linha (com-c
).
Responder2
Qual é o “Título” de um arquivo, o caminho ou o nome? Use a opção --files-with-matches ou -l para listar os nomes de arquivos correspondentes. Se você pesquisar apenas strings fixas em vez de expressões regulares, acelere o processo com -F
grep -F -r -l [email protected] ~/users/example
Combine outro conteúdo do arquivo, grep a lista de arquivos encontrados (fgrep é o mesmo que grep -F):
fgrep -rl [email protected] ~/users/example | xargs grep '^Subject:'
Dica: muitos comandos interrompem a análise de opções no primeiro argumento sem caractere de menos. Portanto, todas as opções devem ser chamadas primeiro.
Responder3
Com mutt
:
muff -f ~/users/example/.Archives.2013
(assumindo que seja uma pasta maildir). E dentro mutt
, digite l(minúsculas L
).
No Limit to messages matching:
prompt, digite:
~C [email protected]
(embora, estritamente falando, como é um regexp, deve ser ~C 'my@example\.com'
correspondido .
literalmente).
Ou comece mutt
como:
mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'
~C
pesquisas nos cabeçalhos To:
e Cc:
.
Verificaro manualpara a sintaxe de pesquisa.
Para pesquisar em mais de uma caixa de correio ao mesmo tempo, existem vários indexadores de correio que você pode usar (dentro mutt
ou não). Verhttps://dev.mutt.org/trac/wiki/UseCases/SearchingMailpor exemplo.