一、问题描述
在使用 Hugo 搭建博客的过程中,遇到了以下问题:
1. 文章发布时间错误
新发布的文章(0012号)的时间戳比前一篇(0011号)还早,导致文章排序混乱。
原因分析:
- 手动填写时间戳容易出错
- 时间戳格式复杂,容易写错
- 没有自动校验机制
2. 时间戳管理繁琐
Hugo 文章的 front matter 需要手动填写时间:
---
title: "文章标题"
date: 2026-03-09T01:00:00+08:00 # 手动填写,容易出错
lastmod: 2026-03-09T01:00:00+08:00
---
痛点:
- 时间格式复杂(ISO 8601 格式)
- 需要同时填写
date和lastmod - 每次都要查当前时间
- 精度不够(只精确到小时)
二、解决方案
方案设计
创建两个 Shell 脚本实现自动化:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ new_post.sh │ ──► │ 编辑文章内容 │ ──► │ publish.sh │
│ 创建新文章模板 │ │ │ │ 发布到网站 │
│ 自动填充时间戳 │ │ │ │ 一键部署 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
1. 创建新文章脚本 new_post.sh
#!/bin/bash
# 博客新文章创建脚本
# 用法: ./new_post.sh <文章编号> <文章标题>
# 示例: ./new_post.sh 0013 "我的新文章标题"
BLOG_DIR="$(cd "$(dirname "$0")" && pwd)"
POSTS_DIR="$BLOG_DIR/content/posts"
if [ $# -lt 2 ]; then
echo "用法: $0 <文章编号> <文章标题>"
echo "示例: $0 0013 \"我的新文章标题\""
exit 1
fi
POST_NUM=$1
POST_TITLE=$2
# 获取当前时间,精确到分钟
CURRENT_TIME=$(date "+%Y-%m-%dT%H:%M:00+08:00")
# 生成文件名
FILENAME="${POST_NUM}-${POST_TITLE}"
FILEPATH="$POSTS_DIR/${FILENAME}.md"
# 检查文件是否已存在
if [ -f "$FILEPATH" ]; then
echo "错误: 文件已存在 - $FILEPATH"
exit 1
fi
# 创建文章模板
cat > "$FILEPATH" << EOF
---
title: "${POST_NUM} - ${POST_TITLE}"
date: ${CURRENT_TIME}
lastmod: ${CURRENT_TIME}
draft: false
math: false
hideSummary: true
tags: []
categories: ["技术笔记"]
---
## 一、标题
内容...
EOF
echo "✅ 文章创建成功: $FILEPATH"
echo "📅 发布时间: $CURRENT_TIME"
核心功能:
- 自动获取系统当前时间
- 时间精度精确到分钟
- 自动生成标准 front matter
- 文件存在性检查
2. 发布脚本 publish.sh
#!/bin/bash
# 博客发布脚本
# 用法: ./publish.sh <提交信息>
# 示例: ./publish.sh "添加新文章:0013"
BLOG_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ $# -lt 1 ]; then
echo "用法: $0 <提交信息>"
echo "示例: $0 \"添加新文章:0013\""
exit 1
fi
COMMIT_MSG=$1
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "🚀 开始发布..."
echo "📅 当前时间: $CURRENT_TIME"
cd "$BLOG_DIR"
# 清理旧的构建文件
echo "🧹 清理旧文件..."
rm -rf public
# 构建网站
echo "🔨 构建网站..."
hugo --minify
if [ $? -ne 0 ]; then
echo "❌ 构建失败!"
exit 1
fi
echo "✅ 构建成功!"
# Git 操作
echo "📦 提交更改..."
git add -A
git commit -m "$COMMIT_MSG"
echo "🚀 推送到远程仓库..."
git push origin main
if [ $? -ne 0 ]; then
echo "❌ 推送失败!"
exit 1
fi
echo ""
echo "🎉 发布成功!"
echo "🌐 网站地址: https://wubajie.github.io/"
echo "⏰ 发布时间: $CURRENT_TIME"
核心功能:
- 一键构建和部署
- 自动 Git 提交和推送
- 状态反馈和错误处理
- 显示发布时间和网站地址
三、使用方法
完整工作流程
# 步骤 1:创建新文章(自动获取当前时间)
./new_post.sh 0013 "Hugo博客文章时间戳自动化方案"
# 输出:
# ✅ 文章创建成功: content/posts/0013-Hugo博客文章时间戳自动化方案.md
# 📅 发布时间: 2026-03-09T01:20:00+08:00
# 步骤 2:编辑文章内容
# 使用编辑器打开文件,编写内容
# 步骤 3:发布(一键完成)
./publish.sh "添加新文章:0013"
# 输出:
# 🚀 开始发布...
# 📅 当前时间: 2026-03-09 01:20:00
# 🧹 清理旧文件...
# 🔨 构建网站...
# ✅ 构建成功!
# 📦 提交更改...
# 🚀 推送到远程仓库...
# 🎉 发布成功!
# 🌐 网站地址: https://wubajie.github.io/
对比:改进前 vs 改进后
| 操作 | 改进前 | 改进后 |
|---|---|---|
| 创建文章 | 手动创建文件、填写时间 | 一条命令自动完成 |
| 时间格式 | 手动输入,容易出错 | 自动生成,格式标准 |
| 时间精度 | 精确到小时 | 精确到分钟 |
| 发布流程 | 多条命令手动执行 | 一键发布 |
| 错误率 | 高(时间冲突、格式错误) | 低(自动化校验) |
四、技术要点
1. 时间格式说明
Hugo 使用 ISO 8601 时间格式:
2026-03-09T01:20:00+08:00
│ │ │ │ │
│ │ │ │ └── 时区偏移(东八区)
│ │ │ └─────── 秒
│ │ └───────── 分钟
│ └──────────── 小时
└───────────────── 日期
2. Shell 获取时间
# 获取当前时间,精确到分钟
date "+%Y-%m-%dT%H:%M:00+08:00"
# 输出示例
# 2026-03-09T01:20:00+08:00
3. Hugo 配置优化
在 hugo.toml 中添加:
# 允许发布未来日期的文章
buildFuture = true
这样可以避免因时间设置问题导致文章不显示。
五、扩展建议
1. 添加文章模板选择
可以扩展脚本支持不同类型的文章模板:
# 技术笔记模板
./new_post.sh 0013 "标题" --template=tech
# 生活随笔模板
./new_post.sh 0013 "标题" --template=life
# 读书笔记模板
./new_post.sh 0013 "标题" --template=reading
2. 自动更新 lastmod
在发布脚本中自动更新文章的 lastmod 时间:
# 更新所有已修改文章的 lastmod
find content/posts -name "*.md" -newer .git/index -exec sed -i '' "s/^lastmod:.*/lastmod: $(date "+%Y-%m-%dT%H:%M:00+08:00")/" {} \;
3. 集成 Git Hooks
使用 pre-commit hook 自动检查时间格式:
#!/bin/bash
# .git/hooks/pre-commit
# 检查所有 markdown 文件的时间格式
for file in $(git diff --cached --name-only | grep '\.md$'); do
if ! grep -qE '^date: [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\+[0-9]{2}:[0-9]{2}$' "$file"; then
echo "错误: $file 的时间格式不正确"
exit 1
fi
done
六、总结
通过两个简单的 Shell 脚本,解决了 Hugo 博客时间戳管理的痛点:
| 问题 | 解决方案 |
|---|---|
| 时间戳手动填写繁琐 | new_post.sh 自动获取系统时间 |
| 时间格式容易出错 | 脚本自动生成标准格式 |
| 发布流程复杂 | publish.sh 一键构建部署 |
| 时间精度不够 | 精确到分钟级别 |
核心思想:将重复性工作自动化,减少人为错误,提高效率。