Encontre arquivos contendo texto, mas relate partes diferentes dele como resultado

Encontre arquivos contendo texto, mas relate partes diferentes dele como resultado

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 ToeCc
  • procure [email protected]
  • se encontrado, extraia o Subjectcabeç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 muttcomo:

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

~Cpesquisas 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 muttou não). Verhttps://dev.mutt.org/trac/wiki/UseCases/SearchingMailpor exemplo.

informação relacionada