一、问题描述

在使用 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 格式)
  • 需要同时填写 datelastmod
  • 每次都要查当前时间
  • 精度不够(只精确到小时)

二、解决方案

方案设计

创建两个 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 一键构建部署
时间精度不够精确到分钟级别

核心思想:将重复性工作自动化,减少人为错误,提高效率。


参考资源