关闭网络,以防止OneNote在每次导出后执行冗长的OneDrive同步。
 
在“笔记本”列表中,展开笔记本以查看所有选项卡。
 
右键单击一个选项卡,然后单击“导出...”。
 
单击文件类型下拉菜单,然后按M选择.docx格式。按Enter选择它。
 
再按Enter一次保存导出的文件。
 
对笔记本中的每个选项卡重复步骤2-5。
 
设置pandoc并打开PowerShell或cmd窗口。
 
cd进入导出.docx文件所在的目录。
 
对于每个导出的.docx文件,使用以下pandoc命令将其转换为markdown(替换journal为文件名):
pandoc --extract-media='' --wrap=preserve '.\journal.docx' -o journal.md
这是命令的说明:--extract-media=''告诉pandoc从.docx文件中提取图像,并将其放入默认的子文件夹(默认情况下命名为“ media”)。--wrap=preserve告诉pandoc不要用换行符将输出文件硬包装(这是默认设置)。下一个字段是输入文件名,-o代表“输出”,journal.md输出文件名也是如此。
如果您不想拆分此文件(例如,如果您的选项卡仅包含一页),请跳至步骤15。
(在执行这些操作时,可以按↑(向上箭头)键在外壳中调用上一个命令,然后编辑文件名。)
 
创建一个新文件夹以将页面存储在选项卡中。对于此示例,现在在OneNote中将“日记本”选项卡中的所有页面都混在一起journal.md。创建一个名为的文件夹journal,该文件夹将最终分隔的页面存储为单个.md文件。
 
如果文件中有任何图像.docx,这些图像将被导出到名为的新文件夹中media。将媒体文件夹(如果存在)拖到刚才创建的文件夹中。(这就是为什么我们需要分别执行每个pandoc操作的原因,因为每个导出都将创建一个单独的媒体文件夹,并且我们希望将它们分开以使markdown文件中的链接正常工作。我们可以编写一个聪明的脚本来完成所有这些操作自动,但除非有大量的笔记本,否则手动进行操作会花费更少的时间。)(注意:您可以通过将所需的文件夹名称放在--extract-media=''参数的单引号中来保存步骤,对于.docx包含图片的文件,将会自动为您创建一个文件夹。)
 
打开bash终端,并cd到包含该.md文件的目录。您在步骤10中创建的文件夹必须是该文件夹的子文件夹(除非您在以下命令中修复了路径)。
 
如果还没有,请单击Windows Bash窗口图标,单击“属性”,检查“快速编辑模式”,然后单击“确定”。现在,再次单击Windows Bash窗口图标,这次单击Defaults,检查QuickEdit Mode,然后单击OK(这样,您以后创建的新Bash窗口将记住此设置)。现在,您可以在终端中选择文本,然后按Ctrl+ C进行复制,或者右键单击终端窗口以将文本粘贴到剪贴板中。现在,我们可以在单独的位置准备命令,然后快速将每个版本粘贴到Bash中。
 
自定义以下命令,然后为.md要拆分为各个页面的每个文件运行该命令:
csplit ./journal.md --keep-files --prefix='journal/journalentry ' 
--suffix-format='%i.md' --elide-empty-files '/^\(Monday\|Tuesday\|Wednesday\|Thursday\|Friday\|Saturday\|Sunday\),/-2' '{*}'
(将其键入为一行。)
如您所见,journal.md是我们的markdown文件的名称(在当前目录中,由表示./),第二个出现的journal(之后--prefix=')是我们的子文件夹的名称,该子文件夹将包含拆分文件,并且journalentry每个文件将被命名为(后接索引号)。
如果您想了解该命令,这里有一个解释:--keep-files遇到错误或文件末尾时仍会打印文件,以确保最后一页将正确输出(因为它没有以正则表达式的模式结尾)。--prefix设置输出文件的命名方案。--suffix-format允许我们设置文件扩展名(.md在这种情况下),但是我们必须%i在sprintf语句中包含输出文件索引号的语句。  --elide-empty-files跳过输出空文件,我们不在乎。最后,以开头'/和结尾的正则表达式/-2',定义何时分割文件:它说“当您在(^)行的开头找到(/)时,以下(()星期一或(\ |)星期二或星期三或星期四或星期五或星期六或星期日() ),然后用逗号分隔,退后两行(-2)“,然后在此处拆分文件,输出到目前为止的内容。最后一位'{*}'无限期地重复前一个命令,直到到达文件末尾。
 
将.docx和.md文件拖到文件夹中,例如您现在创建的文件夹intermediates。或者,您可以删除它们。最好保存一段时间,直到您对新文件格式感到满意为止,以防您想返回并参考转换过程中发生的事情。现在将它们移至中间体文件夹将无视忘记我们在哪里并重复步骤的机会。
 
对.docx从OneNote导出的每个文件重复步骤9-14 。
 
现在,每个选项卡都有一个文件夹,其中有一堆单独的.md文件,每个页面一个!再加上media在每个子文件夹的已在OneNote的标签图像。
 
我建议将每个OneNote笔记本导出为.mht文件(“单个文件网页”),也可以将其导出为.pdf。这样,如果由于多次转换而在某些markdown文件中丢失了格式或其他信息,您可以随时返回并轻松查看它在.mht文件中的外观。另外,我建议将每个OneNote笔记本作为.onepkg文件导出(OneNote包),因此,如果您想以其原始/原始文件格式在OneNote中重新打开笔记本,则可以得到一个很好的最终导出副本。例如,如果.mht文件还缺少您要恢复的某些原始格式)。
 
完成每个笔记本后,右键单击OneNote中的笔记本,然后单击“关闭此笔记本”,这样就不会意外编辑笔记本,而不必重新导出新更改。对于降价文件夹,我还为每个笔记本创建了一个文件夹,并将所有选项卡文件夹放入其中。
 
完成整个导出项目后,您可以转到OneDrive并删除已在那里同步的所有OneNote笔记本原件(当然,请确保您现在正在备份自己的文件!当然,还有适用于Linux的OneDrive)可以尝试类似Syncthing)。
 
最后,我们可以使用两个脚本将所有.md文件重命名为其OneNote页面标题,即每个文件的第一行。制作以下文件:
文件1: ~/scripts/rename-files-to-first-line.sh
for i in *md ; do mv -n "$i" "$(cat "$i"|head -n1|tr -d '\000-\037[]{}()/\?*')".md; done
档案2: ~/scripts/recurse.sh
CDIR=$(pwd)
for i in $(ls -R | grep :); do
    DIR=${i%:}                    # Strip ':'
    cd $DIR
    $1                            # Your command
    cd $CDIR
done
然后导航到您的notes文件夹并recurse.sh使用以下rename-files-to-first-line.sh命令作为参数运行命令:
$ ~/scripts/recurse.sh ~/scripts/rename-files-to-first-line.sh
您将看到脚本以递归方式遍历所有文件,在前几行奇怪(不会转换为文件名)的文件上以及在其他情况下引发一些错误。但是,mvin中的命令rename-files-to-first-line使用参数来执行-n,这将防止其覆盖任何文件。可能有一些笔记没有重命名,因为它们的第一行是空白或其他怪异的东西,但是您可以手动修复这几个文件。
 
充分利用OneNote进行彻底的逃生。