如何使用终端将 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.txt
到 chunk_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.
如果我没理解错的话,您想将文件拆分,然后将它们组合成一个大文件,然后再导入。这听起来像是 split
和 cat
的本意。拆分根据您的大小规格拆分文件,无论是基于行还是字节。然后它为这些文件添加一个后缀以保持它们的顺序,然后您使用 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.txt
和 mbox
文件):
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
您可能需要稍微试验一下,以适应您的邮箱大小。另一方面,由于这似乎是一次性任务,您可能不想在这上面花费太多时间。
所以我已经 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.txt
到 chunk_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.
如果我没理解错的话,您想将文件拆分,然后将它们组合成一个大文件,然后再导入。这听起来像是 split
和 cat
的本意。拆分根据您的大小规格拆分文件,无论是基于行还是字节。然后它为这些文件添加一个后缀以保持它们的顺序,然后您使用 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.txt
和 mbox
文件):
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
您可能需要稍微试验一下,以适应您的邮箱大小。另一方面,由于这似乎是一次性任务,您可能不想在这上面花费太多时间。