하루 만에 Claude Code로 3,674개의 Obsidian Vault 파일을 정리한 방법
Source: Dev.to
위에 제공된 텍스트를 한국어로 번역하려면 실제 번역할 내용이 필요합니다. 번역하고 싶은 전체 텍스트(코드 블록이나 URL을 제외한 본문)를 알려주시면, 원본 형식과 마크다운을 그대로 유지하면서 한국어로 번역해 드리겠습니다.
소개
내 Obsidian Vault에 Evernote, Apple Notes, 그리고 Apple Journal에서 내보낸 3,674개의 Markdown 파일이 있었습니다. 프론트‑매터도, 태그도, 분류도 없었습니다. 웹 클리핑이 내 글과 섞여 있었고, 중복 파일이 여기저기 있었습니다. 저는 **Claude Code (Opus 4.6)**를 사용해 하루 만에 모두 정리했습니다.
Source: …
Metric
| Metric | Before | After |
|---|---|---|
| 전체 파일 수 | 3,674 | ~1,000 |
| 프론트‑매터가 있는 파일 | 0 | 전체 |
| 중복 파일 | 2,751 | 0 |
| MOC (Map of Content) | 0 | 5 |
| 플러그인 (설정된) | 0 | 10 |
| 템플릿 | 0 | 6 |
Obsidian은 풍부한 커뮤니티 플러그인 생태계를 가지고 있습니다. 3,674개의 파일에 프론트‑매터를 일괄 삽입하고, 폴더 구조를 기반으로 태그를 지정하며, 중복 파일을 감지·제거하고, JSON 형식의 플러그인 설정을 일괄 편집하는 작업은 GUI만으로는 실현하기 어렵습니다.
Claude Code를 사용하면 셸에서 다음과 같이 모든 작업을 제어할 수 있습니다:
- Python 스크립트 생성 및 실행 – 분류 로직을 Python으로 작성하고 즉시 실행합니다.
- 파일별 내용 판단 – 혼합된 폴더에 있는 100개 이상의 파일을 하나씩 읽어 분류합니다.
- 플러그인 설정의 JSON 편집 – 10개의 플러그인 설정을 일괄 업데이트합니다.
- 빠른 반복 – 오류가 발생한 스크립트를 수정하고 즉시 다시 실행합니다.
요컨대, “규칙 기반과 판단 기반 처리를 대량의 파일에 적용하는” 작업은 Claude Code가 가장 강점을 발휘하는 영역입니다.
Front‑matter insertion
나는 Claude Code를 사용해 파이썬 스크립트를 생성하고 실행하여 3,491개의 Markdown 파일에 다음 구조의 front‑matter를 삽입했습니다:
---
category: tech # tech / personal / creative / reference
type: fleeting # fleeting / literature / permanent / moc
status: draft # draft / review / done
tags:
- journal
- reflection
source: evernote # evernote / apple-notes / apple-journal
date: "2020-01-15"
---
26개의 폴더에 대해 폴더‑대‑태그 매핑을 정의했으며, bulk_frontmatter.py는 3,491개의 파일을 오류 없이 처리했습니다.
macOS filename normalization
Apple Notes에서 내보낸 파일들은 파일명 매칭 오류가 발생했습니다. 원인은 macOS 파일 시스템이 NFD (Normalization Form D) 형태로 파일명을 저장하는 반면, 파이썬 문자열 리터럴은 NFC 형태였기 때문입니다.
# macOS filesystem stores filenames in NFD
# Python string literals are NFC
# → They don't match
import unicodedata
# Solution: Normalize to NFC before comparison
normalized = unicodedata.normalize("NFC", filename)
Tip: macOS에서 비‑ASCII 파일명을 다루는 파이썬 스크립트를 작성한다면
unicodedata.normalize("NFC")를 반드시 사용하세요. 이는 Obsidian에만 국한되지 않고 모든 파일 작업에 적용됩니다.
중복 및 저콘텐츠 제거
- Evernote 내보내기는
2.md패턴을 따르는 방대한 중복 파일을 생성합니다. 정규식으로 이를 감지하고 원본과 차이를 확인한 뒤 삭제했습니다. - 문자 수가 매우 적은 파일(≤ 50자, 통계 전용 표 등)도 제거했습니다. 폴더마다 임계값이 달랐으며, 짧은 기록이라도 가치가 있는 저널 폴더는 제외했습니다.
실패한 접근법: 히라가나‑비율 휴리스틱
내가 쓴 글은 히라가나 비율이 높을 것이라고 가정하고 이를 기준으로 필터링을 시도했습니다. 하지만 일본어 웹 기사도 히라가나 비율이 높아 대량 오분류가 발생했습니다.
# This didn't work
def is_personal(text: str) -> bool:
hiragana = sum(1 for c in text if '\u3040' 0.3 # No threshold gave acceptable accuracy
성공한 접근법: 폴더‑레벨 분류
결국 Evernote‑시대 폴더 구조가 가장 신뢰할 수 있는 분류 기준이었습니다.
- 내가 직접 쓴 글이 명확히 들어 있는 폴더(저널, 회고 등)는 유지했습니다.
- 웹‑클립‑많은 폴더(Study, Lifehack 등)는 전체를 아카이브로 이동했습니다.
혼합된 폴더(예: Inbox)만 Claude Code가 파일을 개별적으로 읽고 판단해야 했습니다. 124개의 파일 중 47개는 개인 글로, 77개는 웹 클립으로 분류되었으며 정확도가 높았습니다.
교훈: 자연어의 통계적 특징만으로 콘텐츠 출처를 구분하는 것은 어렵습니다. 메타데이터(폴더 구조, 파일명 패턴)가 훨씬 더 신뢰할 수 있습니다.
플러그인 구성
볼트 구조가 확정된 후, 다음 플러그인들을 설치하고 설정했습니다:
| 플러그인 | 목적 | 설정 하이라이트 |
|---|---|---|
| Dataview | 메타데이터 기반 쿼리 및 대시보드 | JS 쿼리 및 인라인 활성화 |
| Linter | 프론트매터 자동 포맷 | YAML 키 순서 고정, 중복 태그 제거 |
| Templater | 템플릿 엔진 | 폴더‑템플릿 연결 |
| Tag Wrangler | 대량 태그 이름 바꾸기 및 병합 | 77개의 태그 정리 |
| Calendar | 캘린더 뷰 | 일본어 로케일, 주 시작 요일 월요일 |
| Auto Note Mover | 새 노트 자동 정렬 | 인박스로 funnel, 레거시 폴더 제외 |
| QuickAdd | 빠른 캡처 | 목적별 3개 명령 |
| Graph | 지식 그래프 시각화 | 폴더별 색상 코딩 |
| Smart Connections | 의미 검색 및 연관 노트 | 다국어 모델로 전환 (아래 참고) |
| Periodic Notes | 일/주/월 노트 | 템플릿 통합 |
Obsidian은 플러그인 설정을 .obsidian/plugins/{plugin‑name}/data.json에 저장합니다. Claude Code로 이 JSON을 직접 편집하면 GUI를 클릭하는 수고를 줄일 수 있습니다. 하지만 중요한 주의사항이 있습니다:
Obsidian이 실행 중일 때는 설정을 편집하지 마세요. Obsidian은 설정을 메모리에 보관하므로 CLI로 편집한 내용은 다음 저장 시 덮어씌워집니다. 항상 Obsidian을 종료한 뒤에 편집하세요.
볼트 루트 혼동
세션 중에 플러그인 설정 변경이 전혀 적용되지 않는 문제가 발생했습니다. 조사 결과, 볼트가 상위 디렉터리를 가리키고 있어 두 개의 .obsidian 디렉터리가 존재하게 된 것이 원인이었습니다:
Documents/ ← Obsidian이 이 디렉터리를 볼트 루트로 인식
├── .obsidian/ ← 이 설정이 활성화됨
└── Obsidian Vault/
├── .obsidian/ ← 이 디렉터리는 무시됨
└── (실제 노트)
올바른 .obsidian 디렉터리를 병합하면 문제가 해결되었습니다.
교훈: 플러그인 설정이 적용되지 않을 때는 먼저
find . -name ".obsidian" -type d명령을 실행해.obsidian위치를 확인하세요.
Smart Connections 특이점
- 기본 임베딩 모델 TaylorAI/bge-micro-v2는 영어에 최적화돼 있어 비영어 볼트에서는 성능이 저조합니다.
- 또한, 이 플러그인의 설정은
data.json이 아니라.smart-env/smart_env.json에 저장됩니다.
# 중요: 일반적인 data.json이 아니라 .smart-env/smart_env.json을 편집하세요
다국어 모델(예: intfloat/multilingual-e5-base)로 전환하면 일본어 위주 볼트에서도 의미 검색이 정상적으로 작동합니다.
요약
- 대량 작업(front‑matter 삽입, 태그 일괄 이름 변경, 중복 제거)은 GUI보다 스크립트로 수행하는 것이 가장 좋습니다.
- 파일 시스템 정규화는 macOS에서 중요합니다; 비교하기 전에 파일 이름을 항상 NFC로 정규화하세요.
- 메타데이터가 휴리스틱보다 우수 – 폴더 구조와 파일명 패턴은 언어 통계 기법보다 훨씬 신뢰할 수 있습니다.
- 플러그인 설정은 오프라인에서 편집해야 하며, 올바른
.obsidian디렉터리를 편집하고 있는지 확인해야 합니다. - 다국어 볼트의 경우, 의미 검색 플러그인을 위해 적절한 임베딩 모델을 선택하세요.
Claude Code가 무거운 작업을 처리해 주어, 저는 혼란스러운 3,674개의 파일을 하루 만에 깔끔하고 검색 가능하며 잘 구조화된 Obsidian 볼트로 바꾸었습니다.
요약
- 문제: Obsidian Smart Connections이 기본 영어 임베딩 모델을 사용하고 있었으며, 이 모델은 다국어 관계를 포착하지 못했습니다.
- 해결책: 임베딩 모델을
Xenova/multilingual-e5-small로 전환하고 볼트를 다시 인덱싱했습니다. - 결과: 이제 관련 노트가 언어를 초월한 정확한 연결을 표시합니다.
교훈:
Obsidian 플러그인 설정이 항상data.json에 저장되는 것은 아닙니다. 설정이 효과가 없는 것처럼 보일 때는.obsidian/plugins/{plugin}/외부의 파일도 확인하세요 (예:.smart‑env/).
Configuration Change
// .smart-env/smart_env.json
{
"smart_sources": {
"embed_model": {
"model_key": "Xenova/multilingual-e5-small"
}
}
}
모델 키를 업데이트하고 임베딩 캐시를 정리하여 새로 인덱싱한 후, 다국어 연결이 올바르게 표시되었습니다.
Vault 정리
1. 콘텐츠 맵 (MOCs)
MOC는 특정 주제에 대한 다른 노트를 수동 링크와 Dataview 쿼리를 혼합하여 나열하는 노트입니다. 예시 쿼리:
TABLE date, status
FROM #books
SORT date DESC
2. Dataview 대시보드
대시보드에는 다음이 표시됩니다:
- 상태별 노트 수
- 최근 업데이트된 노트
- 분류되지 않은 노트
Dataview의 JS 쿼리를 활성화하면 보다 유연한 집계가 가능합니다.
Claude Code를 활용한 자동화
iCloud에 호스팅된 Obsidian vault(3,674 .md 파일)에 Claude Code를 실행했습니다. 토큰 제한 때문에 모든 파일을 한 번에 Claude에 전달하는 것은 비현실적이어서 워크플로우는 다음과 같이 구성되었습니다:
- Claude로 Python 스크립트 생성
- 스크립트를 로컬에서 실행
- 결과를 검토하고 문제를 수정한 뒤 반복
Scripts Used
| Script | Purpose | Files Processed |
|---|---|---|
bulk_frontmatter.py | 대량 front‑matter 삽입 | 3,491 |
apple_notes_folders.py | 하위 폴더 기반 분류 | 66 |
apple_notes_root.py | 내용 분석 기반 분류 | 86 |
vault_audit.py | 태그 분포 및 누락 탐지 | All |
tag_cleanup.py | 태그 병합 및 이름 변경 | All |
기술 요약
- macOS + 비 ASCII 파일명 →
unicodedata.normalize("NFC")로 경로를 정규화해야 합니다.- NFD/NFC 불일치가 파일 검색, 패턴 매칭, 사전 키 조회를 깨뜨립니다.
- 백업 전략:
- 대량 작업 전에
tar.gz백업을 만들었습니다. - 히라가나‑비율 분류가 실패해 복원이 필요했습니다.
- 빠른 복원 백업을 갖추면 “시도 → 실패 → 복원” 사이클을 신속하게 진행할 수 있습니다.
- 대량 작업 전에
- 플러그인 설정:
- JSON을 직접 편집할 수 있지만 Obsidian을 종료한 후에만 적용됩니다.
- 볼트 루트 문제와 비표준 설정 파일에 주의하세요.
주요 요점
-
대량 처리 = 코드 생성 + 로컬 실행
- 모든 파일을 Claude에 넣지 말고, 로직을 Python(또는 다른 언어)으로 인코딩하고 직접 실행하세요.
-
메타데이터가 휴리스틱보다 우수
- 폴더 구조와 프론트‑매터는 통계적 휴리스틱(예: 히라가나‑비율)보다 훨씬 신뢰할 수 있습니다.
-
Smart Connections 다국어 지원
.smart‑env/smart_env.json에서multilingual‑e5‑small로 전환하세요.
-
macOS에서 유니코드 정규화는 필수 비‑ASCII 파일명에 대해.
-
Claude Code는 범용 조직자
- 규칙 기반 배치 스크립트와 가끔 필요한 내용 기반 인간 판단과 결합될 때 뛰어납니다.
위 모든 것을 통해 하루 만에 3,674‑노트 전체를 재구성할 수 있었습니다.