如何在Hexo中对文章md文件分类

小编 2026-06-20 阅读:201 评论:0
Hexo是一个快速、简洁且高效的博客框架,常用在Github Page上部署个人博客。 起因 在默认配置下,我们使用hexo new post [title]会在source/_post/目录...

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;

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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表