102 lines
3.1 KiB
Bash
Executable File
102 lines
3.1 KiB
Bash
Executable File
#!/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" |