#!/bin/bash # 进入项目根目录 cd ~/Git仓库/Home-of-CS/ || { echo "无法进入项目目录"; exit 1; } POST_DIR="content/post" # 检查 content/post 是否存在 if [ ! -d "$POST_DIR" ]; then echo "错误:目录 $POST_DIR 不存在" exit 1 fi # 1. 扫描所有子目录,提取唯一前缀 echo "正在扫描已有前缀..." prefixes=$(find "$POST_DIR" -maxdepth 1 -type d -name "*_*" | while read -r dir; do basename=$(basename "$dir") # 提取第一个下划线之前的部分 echo "${basename%%_*}" done | sort -u) if [ -n "$prefixes" ]; then echo "已存在的前缀:" echo "$prefixes" | tr '\n' ' ' echo else echo "未找到任何符合格式(含下划线)的子目录" fi # 2. 读取用户输入的前缀并转为大写 read -p "请输入要使用的目录前缀: " input_prefix if [ -z "$input_prefix" ]; then echo "前缀不能为空" exit 1 fi prefix=$(echo "$input_prefix" | tr '[:lower:]' '[:upper:]') # 3. 获取当前日期时间 year=$(date +%Y) month=$(date +%m) day=$(date +%d) hour=$(date +%H) # 4. 生成基础目录名(如 FRA_2026_05_27_22) base_name="${prefix}_${year}_${month}_${day}_${hour}" target_name="$base_name" counter=2 # 5. 统计当前目录数量(不包括新目录) # 使用 find 统计子目录数量,排除当前目录(.) current_count=$(find "$POST_DIR" -maxdepth 1 -type d ! -path "$POST_DIR" | wc -l) MAX_DIRS=238328 # 62^3 if (( current_count + 1 > MAX_DIRS )); then echo "错误:目录数量已达上限 ${MAX_DIRS},无法创建新目录" exit 1 fi # 6. 处理重名(避免与已有目录冲突) while [ -d "$POST_DIR/$target_name" ]; do target_name="${base_name}_${counter}" ((counter++)) done echo "将创建目录:$target_name" # 7. 执行 hugo new 命令创建文章 if ! hugo new "content/post/$target_name/index.md"; then echo "❌ hugo new 命令执行失败,请检查 hugo 是否安装及路径是否正确" exit 1 fi # 8. 计算 base62 编码(索引 = 新目录的序号 = current_count + 1) index=$((current_count +1)) num=$((index - 1)) # 编码时从 0 开始 # base62 字符集:0-9(0-9), A-Z(10-35), a-z(36-61) chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" encode="" temp=$num for i in 1 2 3; do remainder=$((temp % 62)) encode="${chars:$remainder:1}${encode}" temp=$((temp / 62)) done # 若 temp 不为 0 说明 num 超过了 62^3-1,但前面已做上限检查,此处不会发生 slug_value="$encode" # 9. 修改 index.md 中的 slug 字段 index_file="$POST_DIR/$target_name/index.md" if [ -f "$index_file" ]; then # 使用 sed 替换 slug 行(兼容单引号或双引号,保留原有引号格式) # 匹配 slug: "..." 或 slug: '...',将引号内容替换为编码 sed -i.bak -E "s/^(slug:[[:space:]]*['\"])(.*)(['\"])$/\1${slug_value}\3/" "$index_file" rm -f "${index_file}.bak" echo "已设置 slug: \"$slug_value\"" else echo "⚠️ 警告:未找到文件 $index_file,slug 未修改" fi echo "成功创建文章:content/post/$target_name/index.md"