Encontre arquivos contendo texto, mas relate parte diferente como resultado

3

Eu quero encontrar todos os e-mails nas minhas pastas IMAP que contêm um determinado texto (a saber: que são enviados para um determinado endereço de e-mail). Eu já descobri que posso fazer isso usando o grep da seguinte forma:

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 é conhecer o "Título" do arquivo de e-mail 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, eu de alguma forma preciso encontrar os arquivos baseados no grep acima, mas o resultado listado deve ser uma parte diferente do mesmo arquivo (talvez com regex?).

Como posso fazer isso?

    
por Florian Peschka 07.04.2017 / 06:56

3 respostas

2

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 e-mail

  • extraia os cabeçalhos To e Cc
  • pesquise [email protected]
  • se encontrado, extraia o cabeçalho Subject e imprima-o em uma linha (com -c ).
por 08.04.2017 / 09:44
1

O que é o "Título" de um arquivo, o caminho ou o nome? Use a opção --files-with-matches ou -l para listar nomes de arquivos correspondentes. Se você procurar apenas strings fixas em vez de expressões regulares, acelere o processo com -F

grep -F -r -l [email protected] ~/users/example

Faz corresponder 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 param a análise de opções no primeiro argumento sem o caractere menos. Então, todas as opções devem ser chamadas primeiro.

    
por 08.04.2017 / 07:58
1

com mutt :

muff -f ~/users/example/.Archives.2013

(assumindo que é uma pasta maildir). E dentro de mutt , digite l (minúscula L ).

No prompt Limit to messages matching: , insira:

~C [email protected]

(embora estritamente falando, como é um regexp, deve ser ~C 'my@example\.com' para o . ser correspondido literalmente).

Ou inicie mutt como:

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

~C pesquisa nos cabeçalhos To: e Cc: .

Verifique o manual para a sintaxe de pesquisa.

Para pesquisar em mais de uma caixa de correio de uma só vez, existem vários indexadores de e-mail que você pode usar (dentro de mutt ou não). Veja link , por exemplo.

    
por 08.04.2017 / 09:37

Tags