如何使用 tail -f 将每封新邮件写入单独的文件?

如何使用 tail -f 将每封新邮件写入单独的文件?

我正在监控邮件文件中的新邮件。目标是为到达本地主机的每封新邮件创建一个新文件。

这是我目前所拥有的。

current="$(date +"%Y_%m_%d_%I_%M_%p").txt"
tail -f /var/spool/mail/root > $current

问题是没有为每封新邮件创建新文件。有什么建议吗?

答案1

您的邮件池包含 Berkeleymbox格式。任何以五个字符From(空格)开头的行都是开始新消息的分隔符。

shell 循环本身无法动态决定将内容重定向到何处,但是类似这样的操作应该可以工作:

tail -f "$MAIL" |
awk 'BEGIN { n=0; where="/dev/null" }
    /^From / { close(where); where=sprintf("./message-%07s", ++n) }
    { print >>where }'

我们首先在消息中间开始读取的/dev/null情况下写入。现在,每当我们看到新的消息分隔符时,我们都会更新和。最后一行打印指向每一行的所有内容。tailnwherewhere

需要说明的是,这不是处理邮件假脱机的好方法。首先,tail调用之间的任何内容都将丢失;tail如果某些东西截断了邮件假脱机文件,则无法应对。也许你应该看看 Procmail 或 Maildrop。

相关内容