如何使用终端将 mbox 文件拆分为 n-MB 大块?

How to split an mbox file into n-MB big chunks using the terminal?

所以我已经 read through this question 了,但它对我没有任何帮助。我想将 Gmail 生成的 mbox 文件导入另一个网络邮件服务,但问题是每次导入只允许 40 MB 的大文件。

所以我不得不以某种方式将 mbox 文件拆分为最大。 40MB大文件,一个一个导入。你会怎么做?

我最初的想法是使用其他脚本 (formail) 将每封邮件保存为一个文件,然后 运行 一个脚本将它们组合成 40 MB 的大文件,但我仍然不知道如何使用终端执行此操作。

split命令我也看了,怕是会断邮件。 感谢您的帮助!

如果您的 mbox 是标准格式,则每条消息将以 From 和 space:

开头
From someone@somewhere.com

因此,您可以 COPY YOUR MBOX TO A TEMPORARY DIRECTORY 并尝试使用 awk 逐条处理它,仅在任何消息的开头拆分。假设我们为每个输出文件获取 1,000 条消息:

awk 'BEGIN{chunk=0} /^From /{msgs++;if(msgs==1000){msgs=0;chunk++}}{print > "chunk_" chunk ".txt"}' mbox

然后您将获得名为 chunk_1.txtchunk_n.txt 的输出文件,每个文件最多包含 1,000 条消息。

如果你不幸在 Windows(无法理解单引号),你需要将以下内容保存在名为 awk.txt

的文件中
BEGIN{chunk=0} /^From /{msgs++;if(msgs==1000){msgs=0;chunk++}}{print > "chunk_" chunk ".txt"}

然后输入

awk -f awk.txt mbox

My initial thought was to use the other script (formail) to save each mail as a single file and afterwards run a script to combine them to 40 MB huge files, but still I wouldnt know how to do this using the terminal.

如果我没理解错的话,您想将文件拆分,然后将它们组合成一个大文件,然后再导入。这听起来像是 splitcat 的本意。拆分根据您的大小规格拆分文件,无论是基于行还是字节。然后它为这些文件添加一个后缀以保持它们的顺序,然后您使用 cat 将文件放回一起:

$ split -b40m -a5 mbox  # this makes mbox.aaaaa, mbox.aaab, etc.

在其他系统上获取文件后:

$ cat mbox.* > mbox

如果你想破坏文件,你就不会这样做,因为你要将每个文件一个一个地导入到新邮件系统中。

我刚刚根据 Mark Sechell 的回答 改进了一个脚本。如我们所见,该脚本可以根据每个块的电子邮件数量解析 mbox 文件。这个改进的脚本可以根据每个块的定义的最大大小解析 mbox 文件。
因此,如果您在上传或导入 mbox 文件时有大小限制,您可以尝试使用下面的脚本将 mbox 文件拆分为 指定大小*[=34 的块=].
将下面的脚本保存到文本文件中,例如mboxsplit.txt,在包含 mbox 文件的目录中(例如命名为 mbox):

BEGIN{chunk=0;filesize=0;}
    /^From /{
    if(filesize>=40000000){#file size per chunk in byte
        close("chunk_" chunk ".txt");
        filesize=0;
        chunk++;
    }
  }
  {filesize+=length()}
  {print > ("chunk_" chunk ".txt")}

然后 run/type 该目录中的这一行(包含 mboxsplit.txtmbox 文件):

  awk -f mboxsplit.txt mbox

请注意

  • 结果的大小可能大于定义的大小。这取决于在检查块大小之前插入 buffer/chunk 的最后一封电子邮件大小。
  • 不会拆分邮件正文
  • 如果电子邮件大小大于指定的块大小,一个块可能只包含一封电子邮件

我建议您指定的块大小小于或小于最大 upload/import 大小。

formail 非常适合这项任务。您可以查看 formail 的 +skip-total 选项

Options
...
+skip
Skip the first skip messages while splitting.
-total
Output at most total messages while splitting.

根据您邮箱和邮件的大小,您可以尝试

formail -100 -s <google.mbox >import-01.mbox
formail +100 -100 -s <google.mbox >import-02.mbox
formail +200 -100 -s <google.mbox >import-03.mbox

等等

当然,零件的尺寸不必相同。如果有一封大邮件,您可能只有 formail +100 -60 -s <google.mbox >import-02.mbox,或者如果有很多小邮件,可能 formail +100 -500 -s <google.mbox >import-02.mbox.

要查找每个块的初始邮件数,请尝试

formail -100 -s <google.mbox | wc
formail -500 -s <google.mbox | wc
formail -1000 -s <google.mbox | wc

您可能需要稍微试验一下,以适应您的邮箱大小。另一方面,由于这似乎是一次性任务,您可能不想在这上面花费太多时间。