Files
celestial-heart/settings/renaming-protocol.md
Alex a57bb09d85 Initial commit: 천공의 심장 프로젝트 초기화
**프로젝트:**
- 제목: 천공의 심장 (Celestial Heart)
- 장르: 회귀 + 산업 경영 + 하드SF
- 권수: 10권 (각 50화)
- 작성 시스템: v3.0 모드 기반

**주인공:**
- 한세진 (1968년생)
- 회귀: 2026년 58세 → 1988년 20세
- 직업: 항공엔진 엔지니어

**생성 파일:**
- CLAUDE.md (프로젝트 특화 프로토콜)
- README.md (작품 소개)
- settings/ (v3.0 모드 시스템)
  - chapter-format-standard.md
  - writing-mode.md
  - modification-mode.md
  - verification-mode.md
  - renaming-protocol.md

**다음 단계:**
- Phase 1: 마스터 파일 설계
- Phase 2: 1권 플롯 작성
- Phase 3: 실행 준비

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-17 10:10:40 +09:00

9.7 KiB

파일 리네임 안전 절차

작성일: 2026-01-17 버전: 1.0 용도: 챕터 파일 리네임 시 데이터 손실 방지


🚨 위험한 방법 (절대 금지!)

순차 리네임 (덮어쓰기 위험!)

# 30-60화를 31-61화로 변경 (1씩 증가)

mv ch-030.md ch-031.md  # OK
mv ch-031.md ch-032.md  # ❌ 충돌! ch-031.md를 덮어씀!
mv ch-032.md ch-033.md  # ❌ 기존 ch-032 손실!
...

문제:

  • ch-031.md → ch-032.md로 변경 시
  • 기존 ch-032.md가 덮어쓰기됨
  • 원본 ch-031, ch-032 내용 모두 손실!

실제 사례:

30-60화 리넘버링 시:
→ ch-031~045 손실 (덮어쓰기)
→ 복구 불가능 (Git 커밋 전이었다면)

안전한 방법 (필수!)

방법 1: 2단계 리네임 (권장)

원리:

  1. 모든 파일을 임시 이름으로 변경 (충돌 없음)
  2. 임시 이름에서 최종 이름으로 변경 (충돌 없음)

Step 1: 임시 이름으로 변경 (뒤에서부터 역순!)

# 뒤에서부터 역순으로 (중요!)
mv ch-060.md ch-060.tmp
mv ch-059.md ch-059.tmp
mv ch-058.md ch-058.tmp
...
mv ch-031.md ch-031.tmp
mv ch-030.md ch-030.tmp

왜 역순인가?

  • 앞에서부터 하면 여전히 충돌 가능
  • 뒤에서부터 하면 충돌 없음

Step 2: 최종 이름으로 변경 (앞에서부터 순서대로)

# 앞에서부터 순서대로
mv ch-030.tmp ch-031.md
mv ch-031.tmp ch-032.md
mv ch-032.tmp ch-033.md
...
mv ch-059.tmp ch-060.md
mv ch-060.tmp ch-061.md

결과:

  • 모든 파일 안전하게 변경
  • 데이터 손실 없음

방법 2: 자동화 스크립트 (강력 권장!)

rename-chapters.sh:

#!/bin/bash
# 안전한 챕터 파일 리네임 스크립트
#
# 사용법:
#   ./rename-chapters.sh START END INCREMENT
#
# 예시:
#   ./rename-chapters.sh 30 60 1
#   → ch-030~060을 ch-031~061로 변경 (1씩 증가)
#
#   ./rename-chapters.sh 35 50 -5
#   → ch-035~050을 ch-030~045로 변경 (5씩 감소)

set -e  # 에러 시 중단

# 인자 확인
if [ $# -ne 3 ]; then
    echo "사용법: $0 START END INCREMENT"
    echo "예시: $0 30 60 1"
    exit 1
fi

START=$1
END=$2
INCREMENT=$3

# 폴더 확인
CHAPTERS_DIR="volumes/vol-02/chapters"
if [ ! -d "$CHAPTERS_DIR" ]; then
    echo "❌ 오류: $CHAPTERS_DIR 폴더가 없습니다."
    exit 1
fi

cd "$CHAPTERS_DIR"

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "챕터 리네임 시작"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "범위: ch-$START ~ ch-$END"
echo "변경: ${INCREMENT:0:1}$INCREMENT"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# 백업 (선택)
read -p "Git 커밋되어 있습니까? (y/n): " COMMITTED
if [ "$COMMITTED" != "y" ]; then
    echo "⚠️  먼저 Git 커밋하세요!"
    exit 1
fi

# Step 1: 임시 이름으로 변경
echo "Step 1: 임시 이름으로 변경 중..."
echo ""

if [ $INCREMENT -gt 0 ]; then
    # 증가: 뒤에서부터 역순
    for i in $(seq $END -1 $START); do
        OLD="ch-$(printf '%03d' $i).md"
        TMP="ch-$(printf '%03d' $i).tmp"

        if [ -f "$OLD" ]; then
            mv "$OLD" "$TMP"
            echo "  $OLD$TMP"
        fi
    done
else
    # 감소: 앞에서부터 순서대로
    for i in $(seq $START $END); do
        OLD="ch-$(printf '%03d' $i).md"
        TMP="ch-$(printf '%03d' $i).tmp"

        if [ -f "$OLD" ]; then
            mv "$OLD" "$TMP"
            echo "  $OLD$TMP"
        fi
    done
fi

echo ""
echo "Step 2: 최종 이름으로 변경 중..."
echo ""

# Step 2: 최종 이름으로 변경
if [ $INCREMENT -gt 0 ]; then
    # 증가: 앞에서부터 순서대로
    for i in $(seq $START $END); do
        TMP="ch-$(printf '%03d' $i).tmp"
        NEW="ch-$(printf '%03d' $((i + INCREMENT))).md"

        if [ -f "$TMP" ]; then
            mv "$TMP" "$NEW"
            echo "  $TMP$NEW"
        fi
    done
else
    # 감소: 뒤에서부터 역순
    for i in $(seq $END -1 $START); do
        TMP="ch-$(printf '%03d' $i).tmp"
        NEW="ch-$(printf '%03d' $((i + INCREMENT))).md"

        if [ -f "$TMP" ]; then
            mv "$TMP" "$NEW"
            echo "  $TMP$NEW"
        fi
    done
fi

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ 리네임 완료!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# 검증
echo ""
echo "검증 중..."
./verify-chapters.sh

verify-chapters.sh:

#!/bin/bash
# 챕터 파일 검증 스크립트

CHAPTERS_DIR="volumes/vol-02/chapters"
cd "$CHAPTERS_DIR"

echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "챕터 파일 검증"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# 1. .tmp 파일 확인
TMP_COUNT=$(ls *.tmp 2>/dev/null | wc -l)
if [ $TMP_COUNT -gt 0 ]; then
    echo "❌ 임시 파일 발견: $TMP_COUNT개"
    ls *.tmp
    exit 1
else
    echo "✅ 임시 파일 없음"
fi

# 2. 파일 개수
MD_COUNT=$(ls ch-*.md 2>/dev/null | wc -l)
echo "✅ 총 파일: $MD_COUNT개"

# 3. 번호 연속성
echo ""
echo "파일 목록:"
ls ch-*.md | sort -V

echo ""
echo "번호 연속성 확인..."
PREV=-1
ERROR=0

for FILE in $(ls ch-*.md | sort -V); do
    NUM=$(echo $FILE | grep -oP '\d+')
    NUM=$((10#$NUM))  # 10진수 변환

    if [ $PREV -ne -1 ]; then
        if [ $NUM -ne $((PREV + 1)) ]; then
            echo "❌ 번호 누락: ch-$(printf '%03d' $((PREV + 1))).md"
            ERROR=1
        fi
    fi

    PREV=$NUM
done

if [ $ERROR -eq 0 ]; then
    echo "✅ 번호 연속성 정상"
fi

# 4. 헤더 형식 확인
echo ""
echo "헤더 형식 확인..."
grep "^# " ch-*.md | while read LINE; do
    FILE=$(echo $LINE | cut -d: -f1)
    HEADER=$(echo $LINE | cut -d: -f2-)

    # "X권 Y화:" 형식 체크
    if ! echo "$HEADER" | grep -qP '^\s*\d+권 \d+화:'; then
        echo "⚠️  $FILE: 헤더 형식 오류"
        echo "    $HEADER"
    fi
done

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "검증 완료"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

📋 리네임 체크리스트

리네임 전

  • Git 커밋 완료 (가장 중요!)
  • 리네임 범위 확인 (START, END)
  • 증감 확인 (INCREMENT)
  • 다른 파일 수정 중 아님 확인

리네임 실행

  • 스크립트 실행 또는 2단계 수동 리네임
  • Step 1 완료 확인 (.tmp 파일들)
  • Step 2 완료 확인 (.md 파일들)

리네임 후 검증

  • .tmp 파일 없는지 확인

    ls volumes/vol-XX/chapters/*.tmp
    # 결과 없어야 정상
    
  • 파일 개수 일치 확인

    # 이전: 60개
    ls chapters/ch-*.md | wc -l
    # 이후: 60개 (또는 +1/-1)
    
  • 번호 연속성 확인

    ls chapters/ch-*.md | sort -V
    # 빠진 번호 없는지 확인
    
  • 헤더 내부 화수 일치 확인

    # ch-031.md 파일의 헤더가 "31화"인지 확인
    grep "^# " chapters/ch-031.md
    # 예상: # 2권 31화: 제목
    
  • Git diff 확인

    git diff --name-status
    # R로 시작 (Rename) 확인
    

🔧 내부 화수 업데이트

문제:

  • 파일명은 ch-031.md
  • 내부 헤더는 "# 2권 30화: 제목" ← 불일치!

해결:

자동 업데이트 스크립트

#!/bin/bash
# update-chapter-numbers.sh
# 챕터 파일 내부 화수를 파일명과 일치시킴

CHAPTERS_DIR="volumes/vol-02/chapters"
cd "$CHAPTERS_DIR"

for FILE in ch-*.md; do
    # 파일명에서 번호 추출
    NUM=$(echo $FILE | grep -oP '\d+')
    NUM=$((10#$NUM))  # 10진수 변환

    # 현재 헤더 확인
    CURRENT_HEADER=$(head -1 "$FILE")

    # 새 헤더 생성 (제목 유지)
    TITLE=$(echo "$CURRENT_HEADER" | sed -E 's/^#\s*\d+권\s*\d+화:\s*//')
    NEW_HEADER="# 2권 ${NUM}화: $TITLE"

    # 헤더 교체
    sed -i "1s/.*/$NEW_HEADER/" "$FILE"

    echo "$FILE: $CURRENT_HEADER$NEW_HEADER"
done

echo ""
echo "✅ 내부 화수 업데이트 완료"

💡 사용 예시

예시 1: 30-60화를 31-61화로 (1씩 증가)

# Git 커밋 확인
git status

# 스크립트 실행
./rename-chapters.sh 30 60 1

# 검증
./verify-chapters.sh

# 내부 화수 업데이트
./update-chapter-numbers.sh

# Git 커밋
git add .
git commit -m "챕터 리네임: 30-60 → 31-61"

예시 2: 35-50화를 30-45화로 (5씩 감소)

./rename-chapters.sh 35 50 -5
./verify-chapters.sh
./update-chapter-numbers.sh
git add .
git commit -m "챕터 리네임: 35-50 → 30-45"

🚨 긴급 복구

.tmp 파일이 남아있다면?

# .tmp 파일을 원래 이름으로 복구
for FILE in ch-*.tmp; do
    ORIGINAL="${FILE%.tmp}.md"
    mv "$FILE" "$ORIGINAL"
    echo "복구: $FILE$ORIGINAL"
done

Git으로 복구

# 리네임 전 상태로 되돌리기
git reset --hard HEAD

# 또는 특정 커밋으로
git reset --hard <commit-hash>

📌 주의사항

  1. 반드시 Git 커밋 후 리네임

    • 문제 발생 시 복구 가능
  2. 스크립트 사용 권장

    • 수동 리네임은 실수 위험 높음
  3. 검증 필수

    • .tmp 파일 확인
    • 번호 연속성 확인
    • 헤더 일치 확인
  4. 내부 화수도 업데이트

    • 파일명과 헤더 일치시키기

버전: 1.0 최종 수정: 2026-01-17 작성자: Alex + Claude Sonnet 4.5