Hexo是一个快速、简洁且高效的博客框架,常用在Github Page上部署个人博客。

起因

在默认配置下,我们使用hexo new post [title]会在source/_post/目录下生成对应的markdown文件,而使用hexo g生成的html文件路径是:year/:month/:day/:title.html。当我们写的博客越来越多的时候,会发现,所有文章都是在source/_post/下,查找起来会不大方便,而希望对它进行一个分类,但是在生成的文章链接上保持不变。

生成的文章名字及其对应永久链接,可以在_config.yml中配置,分别是new_post_name: :title.md # File name of new postspermalink: :year/:month/:day/:title/这两项。我们把new_post_name的值改为:year/:title.md,让每次运行hexo new post [title]时新建的文件按年份存放,但是却发现生成的html文件的链接也变了,比如source/_post/2018/test.md对应的博客地址,原本应该是2018/12/22/test/,现在却变成了2018/12/22/2018/test/。也就是,配置中的permalink值里的:title,实际取的不是文件名称,而是相对于source/_post相对路径(不含后缀)。
这可能是个Bug,因为在permalinknew_post_name中,用的是同一个变量:title,但是它们的值却是不同的。

求解

如果我们是按年月日归档,而链接保持不变,大可配置为如下:

permalink: :title
new_post_name: :year/:month/:day/:title/

但是这样的分类太细了,别说一天写不了几篇,一个月我也不会写太多。我只想生成的文章按年份分文件夹,其他保持不变。所以在_config.yml中是要修改配置为如下的:

new_post_name: :year/:title

而文章的链接,一番搜索之后,发现可以在我们文章的markdown文件的Front-matter中添加permalink参数,来指定文章的链接(见 https://hexo.io/docs/permalinks.html#comment-2657776966 )。如果我们在_config.yml中的permalink配置为如下:

permalink: :year/:month/:day/:title/

那最终生成的文章的链接就是:year/:month/:day/:文章中的permalink/。这完全就是我想要的!

模版

接下来,修改文章模版,增加 permalink一项就好了。文章的模版在scaffolds/post.md,内容修改如下:

---
title: {{ title }}
permalink: {{ title }}
date: {{ date }}
tags:
categories:
---

而我们使用hexo new post [title]创建文章的时候,应注意把标题里的空格换为-

整理

现在新建文章的路径我们是已经处理好了,那以前创建的文章是不是要一个个手动分类并打开添加permalink参数呢?
当然不用那么麻烦。作为终端控,这种事使用命令行来完成最好了。思路为:

  1. 找出2018年的文章
  2. 移动到2018文件夹下
  3. 使用sed命令批量修改文件内容
  4. 找出2017年的文章,按1-3步的方式处理……

需要注意的是,mac下的sed命令在替换文件上与ubuntu上有所不同。比如我想在title:开头的这一行下面添加内容,ubuntu下的命令为

sed -i "/title:.* /a\\xxx" $file

在mac下,需要换行,如下:

sed -i "" "/title.*/ a\
xxx
" $file

上面的a\,反斜杠后要加一个空格,最后的双引号也是要换一行的。
另外要注意的是,sed会修改文章的创建时间,所以我们需要先分类,再修改。以整理2018年的文章为例,完整命令如下:

# 进入_post目录
cd source/_post
# 创建一个2018年1月1日的文件,用于过滤出2018年的文章
touch -t 201801010000 timestamp
# 创建2018文件夹
mkdir 2018
# 将2018年的文章移到2018文件夹下
for file in `find . -type f -newer timestamp`; do mv $file 2018 ; done
# 删除刚才创建的用于过滤的文件
rm timestamp
# 进入2018文件夹
cd 2018
# 修改文章内容,添加permalink
for file in `ls`; do link=`echo $file|sed -n 's/\.md//p'`; sed -i "" "/title.*/ a\
permalink: $link
" $file; done;
# 回到_post
cd ..

优化

上面提到,sedmv会导致文件的创建时间改变,所以需要先分类再修改。尽管这样,当看到所有文件的创建时间都变成一样了之后,对于有强迫症的我还是觉得看着别扭。好在发现,touch命令也可以用于修改文件的创建时间。所以前面的操作可以优化一下:

# 进入_post目录
cd source/_post# 修改文章内容,添加permalink
for file in `ls`; do link=`echo $file|sed -n 's/\.md//p'`; sed -i "" "/title.*/ a\
permalink: $link
" $file; done;# 修改文章的创建时间为Front-matter中的时间
for file in `find . -type f`; do d=`head $file|sed -n 's/^date: //p' |sed -n 's/[- :]//pg' |sed -n 's/\([0-9]\{2\}\)$/\.\1/p'`; echo $d ; done;# 创建一个2018年1月1日的文件,用于过滤出2018年的文章
touch -t 201801010000 timestamp
# 创建2018文件夹
mkdir 2018
# 将2018年的文章移到2018文件夹下
for file in `find . -type f -newer timestamp`; do mv $file 2018 ; done# 将timestamp创建时间修改为2017年1月1日,然后参考2018年文章归类方法,这里略# 完成归类之后删除刚才创建的用于过滤的文件
rm timestamp# 最后如果想再恢复文章的创建时间,再执行第三步命令
for file in `find . -type f`; do d=`head $file|sed -n 's/^date: //p' |sed -n 's/[- :]//pg' |sed -n 's/\([0-9]\{2\}\)$/\.\1/p'`; echo $d ; done;

以上是个人探究这个问题的结果。如有更优方案,欢迎交流指教。

如何在Hexo中对文章md文件分类相关推荐

  1. 在Hexo中为文章自动添加版权信息声明模块

      版权声明: 本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为在Hexo中为文章自动添加版 ...

  2. mysql data ibdata1_database - 如何在MySQL中收缩/清除ibdata1文件

    database - 如何在MySQL中收缩/清除ibdata1文件 我在localhost中使用MySQL作为在R中执行统计的"查询工具",也就是说,每次运行R脚本时,我创建一个 ...

  3. 右键新建中增加新建.md文件

    右键新建中增加新建.md文件 三个步骤 一 随便找个地方创建个.txt文本 里面写 二 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT. ...

  4. linux强制移除pdf密码,分享|如何在 Linux 中从一个 PDF 文件中移除密码

    今天,我碰巧分享一个受密码保护的 PDF 文件给我的一个朋友.我知道这个 PDF 文件的密码,但是我不想透露密码.作为代替,我只想移除密码并发送文件给他.我开始在因特网上查找一些简单的方法来从 PDF ...

  5. Acrobat Pro DC 教程:如何在 PDF 中插入其他 PDF 文件?

    欢迎观看 Acrobat Pro DC 教程,小编带大家学习 Acrobat Pro DC 的基本工具和使用技巧,了解如何在 PDF 中插入其他 PDF文件. 在 Acrobat Pro DC 中选择 ...

  6. android 大文件加密,如何在android中加密大视频文件

    我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...

  7. 如何在MyEclipse中反编译class文件

    反编译class文件,以前都是用的jd-gui.exe这个绿色软件.最近学到了如何在Myeclipse中直接查看class文件,这里记录一下. 1.下载net.sf.jadclipse_3.3.0.j ...

  8. HTML页面调用md文件显示,javascript – 如何在html文件中包含markdown(.md)文件

    我使用Node.js的完整答案 1.首先安装标记的降价转换器: $npm install --save-dev marked 2.然后在名为generateReadMe.js的新文件中,将markdo ...

  9. 如何在Hexo中实现自适应响应式相册功能

    用最清晰简洁的方法整合一个响应式相册 效果 技术选型 由于我选用的主题使用了fancyBox作为图片弹出展示的框架,查看后表示很不错,能满足需要 http://fancyapps.com/fancyb ...

  10. 如何在linux上压缩文件夹,如何在Linux中使用命令压缩文件和文件夹

    通常情况下,我们都是安装了zip,但验证一下也无妨.你可以运行下面的命令来安装zip sudo apt install zip unzip 现在你知道你的系统支持zip了,你可以继续阅读学习如何在Li ...

最新文章

  1. python自动点赞_用Python模拟技巧带你实现自动抽屉登录自动点赞
  2. ngx对accept加锁操作
  3. MonolithFirst:单体应用优先策略
  4. 【ORACLE】 安装需要注意的问题(一)
  5. Ubuntu 安装 cuda deb 指令 不要自动装9.2
  6. 计算机硬件技术基础5章在线,《计算机硬件技术基础》试题(D)
  7. Magento布局layout.xml文件详解
  8. 预测UI设计师未来发展方向
  9. KmeansDBSCAN
  10. java22:API-Object-String
  11. 建造者模式(Java与Kotlin版)
  12. 20191202_2_识别偷税漏税人
  13. [asp.net控件]asp.net页面传值汇总
  14. Python在线 基础教程
  15. 手把手教你学DSP(TMS320X281X) 2020-11-30
  16. 用 C, C++ 读取DICOM文件
  17. SQL语法——触发器
  18. 迅雷极速版|xunlei下载
  19. 解决Elasticsearch集群 master_not_discovered_exception 异常
  20. 服务器虚拟化svc,服务器虚拟化与SVC技术在高校灾备中的应用

热门文章

  1. youtube-dl 安装和用法
  2. Android WebView 跳转第三方App
  3. html播放器参数,Windows Media Player网页播放器及其参数含义
  4. 第3章 网站评价准则和色彩心理学
  5. 计算机研究计划怎么写,课题研究计划书范文
  6. 51单片机的键盘扫描程序,算法简单有效(来自ourdev)
  7. 工具变量与两阶段最小二乘stata
  8. 如何连接mac与无线打印机?
  9. 实模式8086 与 保护模式80286
  10. 前端和python哪个工资高_前端和后端哪个工资高