我看了这个SO上的问题,但它并不能完全帮助我。我想将由Gmail生成的mbox文件导入到另一个网络邮件服务中,但问题是它每次只允许导入40MB大小的文件。
所以我需要将mbox文件分成最多40MB大小的文件,然后再逐个导入。你会如何做到呢?
我的初始想法是使用另一个脚本(formail
)将每个邮件保存为单独的文件,然后运行一个脚本将它们组合成40 MB大的文件,但我仍然不知道如何在终端上完成这个过程。
我也看了split
命令,但我担心它会截断邮件。
感谢任何帮助!
我刚刚改进了一个脚本,基于Mark Sechell的回答。我们可以看到,那个脚本可以根据每个块中的邮件数量来解析mbox文件。这个改进后的脚本可以根据每个块的定义的最大尺寸来解析mbox文件。
因此,如果您在上传或导入mbox文件时有大小限制,您可以尝试使用下面的脚本将mbox文件分成指定大小的块。
请将下面的脚本保存到一个文本文件中,例如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")}
然后在包含mboxsplit.txt
和mbox
文件的目录中运行/键入以下命令:
awk -f mboxsplit.txt mbox
请注意:
我建议您将块大小指定为小于或低于最大上传/导入大小。
mbox
处于标准格式,则每个消息将以From
和一个空格开头:From someone@somewhere.com
那么,您可以将您的MBOX文件复制到一个临时目录,并尝试使用awk逐条处理它,仅在每个消息的开头进行分割。假设我们选择每个输出文件包含1,000条消息:
COPY YOUR MBOX TO A TEMPORARY DIRECTORY
-> 将您的MBOX文件复制到一个临时目录
awk
-> 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
awk: illegal statement at source line 1
。我甚至开始编辑你的答案,以确保我没有复制不想要的字符。似乎有些地方出了问题。我不知道,但对我来说,print > "chunk_" chunk ".txt"
看起来有点奇怪,这是正确的语法吗? - Alexcat
将它们附加到一个新的 mbox
文件中即可。 - Mark Setchellformail
非常适合这个任务。你可以查看formail的+skip
和-total
选项。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
。etc.
formail -100 -s <google.mbox | wc
formail -500 -s <google.mbox | wc
formail -1000 -s <google.mbox | wc
你可能需要进行一些实验,以适应你的邮箱大小。另一方面,由于这似乎是一次性任务,你可能不想花太多时间在这上面。
原始回答:Original Answer
C:\Users\uf501ap\AppData\Roaming\Thunderbird\Profiles\xyz.default-release\Mail\Local Folders
$ split -b40m -a5 mbox # this makes mbox.aaaaa, mbox.aaab, etc.
一旦您在其他系统上获取了文件:
$ cat mbox.* > mbox
formail
是将每封电子邮件导出到自己的文本文件中,并从中创建大约<40 MB的块的好主意,以便我可以导入它们。因为分割可能会在电子邮件正中间拆分文件,导致无法正确导入。 - Alexsplit
拆分单个电子邮件并不重要,因为cat
会将它们拼接在一起。split
总是按行拆分。 - David W.
{print > ("chunk_" sprintf("%03d",chunk) ".txt");}
- Sojoodi