Hexo博客批量修改分类

hexo博客批量修改分类

背景

建了博客一段时间,感觉原来的分类名不合适,想改。

文章很多,一个个点开改吗?

当然不,因为懒

需求分析

需要实现两个部分:

  1. 遍历目录树下的所有文章文件。
  2. 对给定的文章文件,将YAML头中的categories字段的值更改。

下面思考怎么实现。

第一部分:遍历

这个简单。直接cmd脚本,或者写程序直接递归遍历。

第二部分:处理文件

思路1:c++程序实现

结论:复杂度难以接受。

原因:windows下编译的exe程序默认以ANSI编码读取、处理文件,但是博客文章全部是UTF-8编码,写程序支持UTF-8太麻烦。

好吧还是因为懒

思路2:在linux虚拟机下c++程序实现

不就是编码嘛,换成linux就没问题了。

思路3:使用shell 的sed命令

教程传送门

用法示例

1
sed -i 's/categories: xxx/categories: yyy/' post.md

但是!!虽然cmd中遍历只要for /R就能轻松实现,shell实现遍历超级麻烦!!

其实还是因为懒

最终方案

那么有没有互补的办法呢?

安装gitforwindows的时候也安装了bash,可以在windows下调用shell命令。

所以可以用cmd来实现遍历,然后调用bash执行sed命令。

具体实现

step1

备份!!备份!!备份!!

step2

在_posts文件夹下建立replace.sh

1
sed -i 's/categories: xxx/categories: yyy/' $1

其中$1表示传入的第一个参数,方便后面调用。

step3

在_posts文件夹下建立批处理文件run.bat:

1
2
3
4
5
@echo off
for /r %%i in (*.md) do (
echo %%i
"(路径请自行修改)\_posts\replace.sh" %%i
)

step4

在_posts目录下命令行运行run.bat。

!前方高能警报!

然后bash的窗口就会不停地弹出来又不停地关闭,CPU占用瞬间飙升到100%,风扇呼啦啦的转啊 [捂脸哭泣]

这种状况最终持续到所有文件修改完成为止,和病毒十分相似……

不过好在还是解决了问题的。

”不管黑猫白猫,能抓住老鼠就是好猫。“

——邓小平

反思

如果想要更为友善的视觉效果和更低的资源占用,可以尝试加点延时什么的。

更新:更好的做法

前面发现主要的效率开销其实是不断地新建和销毁bash窗口所致,那么其实只要将所有shell命令输出到一个.sh再调用就可以避免:

1
2
3
4
5
6
7
@echo off
echo>run.sh
for /r %%i in (*.md) do (
echo %%i
echo sed -i 's/categories: 模板/categories: OI/' "%%i">>run.sh
)
run.sh

实测效率确实提高了不少。

0%