md文件分类
Posted 貌似掉线
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了md文件分类相关的知识,希望对你有一定的参考价值。
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 posts
和permalink: :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,因为在permalink
和new_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
参数呢?
当然不用那么麻烦。作为终端控,这种事使用命令行来完成最好了。思路为:
- 找出2018年的文章
- 移动到
2018
文件夹下 - 使用
sed
命令批量修改文件内容 - 找出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 ..
优化
上面提到,sed
和mv
会导致文件的创建时间改变,所以需要先分类再修改。尽管这样,当看到所有文件的创建时间都变成一样了之后,对于有强迫症的我还是觉得看着别扭。好在发现,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;
以上是个人探究这个问题的结果。如有更优方案,欢迎交流指教。
以上是关于md文件分类的主要内容,如果未能解决你的问题,请参考以下文章
unix 编一个shell,使用md5sum将路径中的文件分类