C.W.K.
Stream
Lesson 02 of 04 · published

배치 이름변경은 플랜 빌더야

~12 min · batch-rename, plan-builder, preview

Level 0Finder 에서 길 잃음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"파일 삼백 개를 한 번에 이름 바꾸는 건 특수 능력이 아냐. 프리뷰 하나 가진 삼백 개의 평범한 플랜이야."

파워는 우회 면허가 아냐

배치 이름변경은 빠른 차선이어야 할 것처럼 느껴져 — 수백 파일을 이름 바꾸는데, 분명 FileManager 로 곧장 가는 자기 최적화 경로가 필요하지 않을까? 그 본능이 바로 Waygate 가 거부하는 그거야. 배치 이름변경은 플랜 빌더야: 이름변경 규칙을 제안된 변경 집합으로 조합하고, 단일 이름변경과 똑같은 엔진으로 평범한 불변 오퍼레이션 플랜을 제출해. 파워는 배칭 UI 에 있지, 절대 안전 기계 장치 우회에 있지 않아.

프리뷰는 얼린 계약이야

뭐라도 바뀌기 전에, 배치 이름변경은 완전한 프리뷰를 보여줘: 모든 파일에 대해, 현재 이름이랑 제안된 새 이름, 더하기 각 타깃의 기대 정체성. 그 프리뷰가 얼린 의도야. 프리뷰랑 apply 사이에 세계가 바뀌면 — 딴 앱이 파일을 이름 바꾸거나, 충돌이 나타나면 — apply 가 조용히 밀어붙이지 않아; 현재 현실에 대해 새 프리뷰를 강제해. 네가 승인한 게 돌아가거나, 다시 승인해.

대소문자랑 충돌은 앞에서 검사돼

배치 이름변경엔 자기 함정이 있고, 프리뷰가 잡아: 같은 새 이름으로 붕괴될 파일 둘, 대소문자 구분 안 하는 볼륨에서 대소문자만 바꾸는 변경, 이미 존재하는 타깃. 프리뷰는 이것들을 절반쯤에서 발견하는 놀람이 아니라 제출 전에 해결할 문제로 드러내. 그다음 각 이름변경이 항목별 저널 증거를 가진 불변 플랜으로 엔진을 지나 — 그래서 배치도 항목 하나씩 복구 가능해.

배치 이름변경은 플랜 빌더지 특권 지름길이 아냐. 옛/새 이름이랑 기대 정체성의 완전한 프리뷰를 얼리고, apply 시점 조건이 바뀌면 새 프리뷰를 강제하고, 하나의 엔진으로 평범한 불변 플랜을 제출해. 많은 파일을 한 번에 이름 바꾸는 게 절대 저널링·검증·항목별 증거 탈출을 의미 안 해.
배치에서 순서가 중요하고, 프리뷰가 그걸 보이게 해. 같은 배치에서 딴 파일이 이미 B 라는 이름인데 파일 A 를 B 로 이름 바꾸는 건 뭐라도 돌기 전에 프리뷰가 보여야 하는 충돌이야 — 안전한 해결은 임시 이름을 통한 두 단계 이름변경일 수 있어. 순서 위험을 apply 시점까지 숨기는 배치 도구가 '내 사진 전부 이름 바꿔' 가 조용히 하나를 잃는 방식이야.

Code

규칙 -> 프리뷰 -> 평범한 플랜 (우회 없음)·swift
struct RenamePreviewRow {
    let target: LocationReference
    let currentName: String
    let proposedName: String
    let expectedIdentity: ResourceID
    var problem: RenameProblem?   // collision, case-only, duplicate-target...
}

func buildBatch(_ rule: RenameRule, over items: [LocationReference]) -> [RenamePreviewRow] {
    let rows = items.map { rule.preview(for: $0) }
    return validateForCollisionsAndCase(rows)   // surface problems BEFORE apply
}

func applyBatch(_ rows: [RenamePreviewRow]) async {
    for row in rows where row.problem == nil {
        let plan = OperationPlan(kind: .rename, sources: [row.target],
                                 destination: row.target.renamed(row.proposedName),
                                 expected: [row.expectedIdentity])
        await engine.submit(plan)   // <- the SAME engine as a single rename
    }
}

External links

Exercise

순번을 붙이는 배치 이름변경을 설계해봐: photo.jpg -> photo-001.jpg, photo-002.jpg, 등등. 이제 숨은 충돌을 찾아: 소스 파일 중 하나가 이미 photo-001.jpg 라는 이름이면? 프리뷰가 뭘 보여야 하고 배치가 이름 바꾸려는 파일을 절대 안 덮어쓰도록 엔진이 어떤 순서가 필요한지 묘사해봐.
Hint
소스 중에 photo-001.jpg 가 이미 있으면, 순진하게 딴 파일을 photo-001.jpg 로 이름 바꾸는 건 배치가 나중에 이름 바꿀 파일과 충돌하거나 덮어써. 프리뷰가 그걸 표시해야 하고, 안전한 실행은 임시 이름을 통해 먼저 이름 바꿔 (전부 임시로, 그다음 최종으로), 그래서 곧 옮길 파일이 배치 내 타깃을 절대 차지 안 해. 순서가 게임 전체야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.