AdbFileSync는 Android 기기와 로컬 폴더 간의 파일을 ADB(Android Debug Bridge)를 통해 효율적으로 동기화하는 도구입니다. 특히 Obsidian 보관소(Vault)와 같은 파일 구조를 모바일 기기와 동기화하는 데 최적화되어 있습니다.
- 대화형 설정: 기기 선택, 로컬 및 원격 디렉토리 설정을 대화형 CLI를 통해 간편하게 진행할 수 있습니다.
- 스냅샷 기반 삭제 감지: 이전 동기화 상태를 스냅샷으로 저장하여, 양쪽에서 모두 존재하던 파일이 한쪽에서 사라진 경우 이를 삭제로 판단하고 반영합니다.
- 안전한 동기화: 동기화 실행 전 변경 사항(추가, 수정, 삭제)을 미리 보여주고 사용자의 확인을 거칩니다.
- 의존성 최소화: Python 표준 라이브러리만 사용하며,
adb명령어만 있으면 작동합니다. - 스마트 무시:
.obsidian,.trash와 같은 설정 및 휴지통 폴더를 기본적으로 무시합니다. - .gitignore 지원:
local_sync_dir내의.gitignore파일을 인식하며, 서브디렉토리의 규칙도 실제 git과 동일하게 적용하여 파일을 무시합니다.
- Python 3: 시스템에 Python 3.x가 설치되어 있어야 합니다.
- 가상환경 및 라이브러리 설정:
본 프로젝트는
.gitignore패턴 매칭을 위해pathspec라이브러리를 사용합니다. 아래 명령어로 가상환경을 설정하고 필요한 패키지를 설치하세요.python3 -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt
- ADB (Android Debug Bridge):
- 시스템
PATH에adb가 등록되어 있어야 합니다. - Android 기기에서 개발자 옵션 및 USB 디버깅이 활성화되어 있어야 합니다.
- 시스템
기기를 USB로 연결한 후 다음 명령어를 실행합니다:
python3 app.py- 처음 실행 시: 연결된 기기 목록에서 대상을 선택하고, 원격(기기) 폴더 경로와 로컬 폴더 경로를 입력하는 설정 과정이 진행됩니다.
- 이후 실행 시: 저장된 설정(
.adb_device_selection.json)을 바탕으로 즉시 동기화 계획을 생성합니다.
설정된 기기나 디렉토리를 변경하고 싶다면 --initialize 또는 -i 옵션을 사용하세요:
python3 app.py -i기본 설정 파일 위치 대신 특정 파일을 사용하고 싶을 때 사용합니다:
python3 app.py -c my_config.jsonAdbFileSync는 작업 디렉토리 또는 지정된 위치에 다음 두 가지 JSON 파일을 생성하여 상태를 관리합니다.
사용자가 선택한 기기 정보와 동기화할 폴더 경로를 저장합니다.
{
"selected_device": {
"serial": "R3CN40AZXYZ",
"model": "SM-G991N"
},
"device_sync_dir": "/sdcard/Documents/Obsidian",
"local_sync_dir": "/home/user/Obsidian",
"ignore_git": true
}ignore_git: (선택 사항)true로 설정하면.git폴더와 그 하위 내용을 동기화 대상에서 제외합니다. 기본값은false입니다.
이전 동기화 시점의 파일 상태(수정 시간, 크기)를 기록하여 삭제 여부를 판단하는 데 사용됩니다. 사용 중인 설정 파일명 뒤에 .snapshot이 붙은 형태로 생성됩니다. (예: .adb_device_selection.json.snapshot)
{
"version": 1,
"files": {
"notes/meeting.md": {
"local": [1710650000, 1234],
"device": [1710650010, 1234]
}
}
}[mtime, size]형식으로 저장됩니다.
이 도구는 다음과 같은 규칙으로 동기화를 수행합니다:
- 신규 파일: 한쪽에만 있는 파일은 반대편으로 복사합니다.
- 수정된 파일: 수정 시간(mtime)과 파일 크기를 비교하여 더 최신 파일을 반대편에 덮어씁니다.
- 삭제된 파일:
- 이전 동기화 스냅샷에 기록되어 있던 파일이 한쪽에서만 사라진 경우, 사용자가 의도적으로 삭제한 것으로 간주하여 반대편 파일도 삭제합니다.
- 스냅샷 정보가 없는 경우(최초 동기화 등)에는 안전을 위해 삭제를 수행하지 않고 신규 파일로 취급하여 복원합니다.
PyInstaller를 사용하여 실행 파일(.exe 또는 실행 가능 바이너리)로 만들 수 있습니다:
# packaging.sh 실행 또는 아래 명령어 입력
pyinstaller --onefile --name obsidian_sync app.py빌드된 실행 파일은 dist/ 디렉토리에 생성됩니다.
app.py: CLI 진입점 및 대화형 사용자 인터페이스.sync.py: 핵심 동기화 알고리즘 및 계획 생성.adb_helper.py: ADB 명령어 실행 및 결과 파싱 유틸리티.config_store.py: 사용자 설정 저장 및 로드.snapshot_store.py: 파일 상태 스냅샷 관리.tests/: 단위 테스트 및 통합 테스트 코드.
주의: 동기화 과정에서 파일이 덮어쓰여지거나 삭제될 수 있으므로, 중요한 데이터는 반드시 미리 백업해 두시기 바랍니다.