
Я хочу найти все письма в моих папках IMAP, которые содержат определенный текст (а именно: которые отправлены на определенный адрес электронной почты). Я уже выяснил, что могу сделать это с помощью grep, например так:
grep -rnw '~/users/example' -e "[email protected]"
Это возвращает либо совпадающий текст, либо имя файла (с -l
). Но что мне действительно нужно для моей задачи, так это узнать «Заголовок» найденного файла электронной почты.
/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
Итак, мне каким-то образом нужно найти файлы на основе grep, приведенного выше, но полученный результат должен быть другой частью того же файла (может быть, с помощью регулярных выражений?).
Как мне это сделать?
решение1
Использование formail
(поставляется с 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 {} +
То есть, для каждого файла электронной почты
- извлечь заголовки
To
иCc
- искать
[email protected]
там - если он найден, извлеките
Subject
заголовок и выведите его на одной строке (с помощью-c
).
решение2
Что такое "Заголовок" файла, путь или имя? Используйте опцию --files-with-matches или -l для вывода списка совпавших имен файлов. Если вы ищете только фиксированные строки вместо регулярных выражений, ускорьте процесс с помощью -F
grep -F -r -l [email protected] ~/users/example
Проверьте остальное содержимое файла, выполнив grep для списка найденных файлов (fgrep — то же самое, что grep -F):
fgrep -rl [email protected] ~/users/example | xargs grep '^Subject:'
Подсказка: многие команды останавливают разбор опций на первом аргументе без знака минус. Поэтому все опции должны быть вызваны первыми.
решение3
С mutt
:
muff -f ~/users/example/.Archives.2013
(предполагается, что это папка maildir). И внутри mutt
введите l(строчные буквы L
).
В Limit to messages matching:
командной строке введите:
~C [email protected]
(хотя, строго говоря, поскольку это регулярное выражение, оно должно ~C 'my@example\.com'
соответствовать .
буквальному выражению).
Или начните mutt
так:
mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C [email protected]"'
~C
поиск в заголовках To:
и Cc:
.
Проверятьруководстводля синтаксиса поиска.
Для поиска в нескольких почтовых ящиках одновременно можно использовать несколько почтовых индексаторов (внутри mutt
или вне их). См.https://dev.mutt.org/trac/wiki/UseCases/SearchingMailнапример.