Skip to content

Rename folders and markdown files based on h1 titles #299

Rename folders and markdown files based on h1 titles

Rename folders and markdown files based on h1 titles #299

name: Rename Markdown Files and Folders in-place
on:
push:
branches:
- main
workflow_dispatch:
jobs:
process-markdown:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITBOOKKEY }}
fetch-depth: 0
- name: Set UTF-8 Encoding
run: |
export LC_CTYPE="UTF-8"
- name: Rename Folders and Files Based on README H1 In-place
shell: bash
run: |
set -euxo pipefail # 디버깅을 μœ„ν•œ μ…Έ μ˜΅μ…˜ μ„€μ •
# λͺ¨λ“  README.md 파일의 κ²½λ‘œμ™€ 헀딩을 미리 μˆ˜μ§‘
mapfile -t readme_files < <(find developLog -type f -name 'README.md')
declare -A dir_mappings # 원본 디렉토리와 μƒˆλ‘œμš΄ λ””λ ‰ν† λ¦¬μ˜ 맀핑을 μ €μž₯
# 디렉토리 이름 변경을 μœ„ν•œ 정보 μˆ˜μ§‘
for file in "${readme_files[@]}"; do
echo "Processing $file"
# README.md νŒŒμΌμ—μ„œ 첫 번째 h1 ν—€λ”© μΆ”μΆœ
heading=$(grep -m 1 '^# ' "$file" | sed 's/^# //')
# 헀딩이 μ—†λŠ” 경우 κ±΄λ„ˆλœλ‹ˆλ‹€
if [[ -z "$heading" ]]; then
echo "헀딩을 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: $file"
continue
fi
# ν—€λ”© μ •μ œ (파일λͺ…에 μ ν•©ν•˜λ„λ‘)
heading=$(echo "$heading" | tr -cd '[:alnum:] _-')
# README.md 파일이 μžˆλŠ” 디렉토리 경둜
dir=$(dirname "$file")
parent_dir=$(dirname "$dir")
# μƒˆλ‘œμš΄ 디렉토리 이름 생성
new_dir="$parent_dir/$heading"
# 디렉토리 맀핑 μ €μž₯
dir_mappings["$dir"]="$new_dir"
done
# 디렉토리 이름 λ³€κ²½ (깊이 순으둜 μ •λ ¬ν•˜μ—¬ ν•˜μœ„ 디렉토리뢀터 λ³€κ²½)
for dir in "${!dir_mappings[@]}"; do
new_dir="${dir_mappings[$dir]}"
echo "Renaming $dir to $new_dir"
# 디렉토리가 이미 μ‘΄μž¬ν•˜λ©΄ κ±΄λ„ˆλœλ‹ˆλ‹€
if [[ -d "$new_dir" ]]; then
echo "디렉토리가 이미 μ‘΄μž¬ν•©λ‹ˆλ‹€: $new_dir. κ±΄λ„ˆλœλ‹ˆλ‹€."
continue
fi
mv "$dir" "$new_dir"
done
# λͺ¨λ“  λ§ˆν¬λ‹€μš΄ 파일의 경둜 μˆ˜μ§‘
mapfile -t markdown_files < <(find developLog -type f -name '*.md' ! -name 'README.md')
# 파일 이름 λ³€κ²½
for file in "${markdown_files[@]}"; do
echo "Processing $file"
# 첫 번째 h1 헀딩을 μΆ”μΆœν•˜μ—¬ 제λͺ©μœΌλ‘œ μ‚¬μš©
title=$(grep -m 1 '^#' "$file" | sed 's/^# //')
if [[ -n "$title" ]]; then
# 제λͺ© μ •μ œ (파일λͺ…에 μ ν•©ν•˜λ„λ‘)
title=$(echo "$title" | tr -cd '[:alnum:] _-')
dir=$(dirname "$file")
ext="${file##*.}"
new_file="$dir/$title.$ext"
# λ™μΌν•œ μ΄λ¦„μ˜ 파일이 이미 μ‘΄μž¬ν•˜λ©΄ κ±΄λ„ˆλœλ‹ˆλ‹€
if [[ "$file" != "$new_file" && ! -e "$new_file" ]]; then
echo "Renaming $file to $new_file"
mv "$file" "$new_file"
else
echo "파일 이름을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€: $file. κ±΄λ„ˆλœλ‹ˆλ‹€."
fi
else
echo "μœ νš¨ν•œ 제λͺ©μ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€: $file. κ±΄λ„ˆλœλ‹ˆλ‹€."
fi
done
# λ³€κ²½λœ 파일과 디렉토리 확인
echo "λ³€κ²½λœ developLog λ””λ ‰ν† λ¦¬μ˜ λ‚΄μš©:"
find developLog -type f
- name: Commit changes
shell: bash
run: |
set -euxo pipefail # 디버깅을 μœ„ν•œ μ…Έ μ˜΅μ…˜ μ„€μ •
# Git μ‚¬μš©μž μ„€μ • (이미 μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄ μƒλž΅ κ°€λŠ₯)
git config user.name 'GoldenPearls'
git config user.email 'prettylee620@naver.com'
# λ³€κ²½λœ 파일 μΆ”κ°€
git add developLog
# 컀밋 μž‘μ„±
git commit -m "Rename folders and markdown files based on h1 titles"
# 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œ
git push origin HEAD:main --force