Найти файлы, содержащие текст, но сообщать о них в качестве результата

Я хочу найти все электронные письма в папках IMAP, содержащих определенный текст (а именно: которые отправляются на определенный адрес электронной почты). Я уже выяснил, что могу сделать это, используя grep:

grep -rnw '~/users/example' -e "my@example.com" 

Это возвращает либо согласованный текст, либо имя файла (с -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 выше, но результат, который указан в списке, должен быть другой частью того же файла (может быть, с регулярным выражением?).

Как я могу это сделать?

3 Solutions collect form web for “Найти файлы, содержащие текст, но сообщать о них в качестве результата”

Использование formail (поставляется с procmail ):

 find ~/users/example -type f -exec sh -c ' for email do formail -x to -x cc < "$email" | grep -qF my@example.com && formail -cx subject < "$email" done' sh {} + 

То есть для каждого файла электронной почты

  • извлеките заголовки To и Cc
  • искать my@example.com там
  • если найден, извлеките заголовок Subject и распечатайте его на одной строке (с -c ).

Что такое «Заголовок» файла, путь или имя? Используйте опцию –files-with-matches или -l для отображения совпадающих имен файлов. Если вы ищете только фиксированные строки вместо регулярных выражений, ускорите процесс с помощью -F

 grep -F -r -l my@example.com ~/users/example 

Соответствует другому содержимому файла, grep список найденных файлов (fgrep совпадает с grep -F):

 fgrep -rl my@example.com ~/users/example | xargs grep '^Subject:' 

Подсказка: многие команды останавливают разбор параметров в первом аргументе без минус-символа. Поэтому все варианты должны быть названы первыми.

С mutt :

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

(предполагая, что это папка maildir). И внутри mutt , тип l (нижний регистр L ).

В поле Limit to messages matching: prompt введите:

 ~C my@example.com 

(хотя, строго говоря, поскольку это регулярное выражение, он должен быть ~C 'my@example\.com' для того, чтобы оно соответствовало буквально).

Или запустите mutt как:

 mutt -f ~/users/example/.Archives.2013 -e 'push "l ~C my@example.com"' 

~C в заголовках To: и Cc:

Проверьте руководство по синтаксису поиска.

Чтобы выполнить поиск в нескольких почтовых ящиках сразу, есть несколько почтовых индексов, которые вы можете использовать (в пределах mutt или нет). Например, см. https://dev.mutt.org/trac/wiki/UseCases/SearchingMail .

  • fetchmail для регистрации полных сообщений И переход в mda
  • Удаление / удаление вложений с сервера электронной почты (IMAP)
  • как настроить альпийский список всех удаленных папок IMAP?
  • Может ли веб-сервер Apache отвечать на запросы SMTP / IMAP / POP3?
  • Как загрузить мои письма на другой почтовый сервер, который я загрузил через IMAP с моего первого?
  • Проблемы с отправкой / получением почтового сервера
  • Почему mutt продолжает просить имя пользователя и пароль imap?
  • Mutt imap несколько учетных записей
  • Gmail блокирует mutt
  • Почтовый уведомитель IMAP для оконного менеджера / панели задач?
  • Невозможно синхронизировать электронную почту с помощью imapsync
  • Linux и Unix - лучшая ОС в мире.