기술 · 실용 가이드
Calibre CSV 목록에 기기에만 있는 책이 빠졌나요? 캐시 목록 내보내기
PC 라이브러리 목록은 리더에만 있는 책을 놓칠 수 있습니다. 기기 캐시 복사본을 변환한 뒤 행 수, 저장소와 가져오기 설정을 확인하세요.

리더의 책을 CSV로 정리하려면 PC 라이브러리 카탈로그가 원하는 목록과 다를 수 있습니다. 라이브러리에서 ondevice:true 로 필터링해도 기존 라이브러리 기록에서 시작하므로 기기에만 있는 책을 추가하지는 않습니다.
읽을 수 있는 metadata.calibre 또는 .metadata.calibre 파일이 있다면 아래 방법은 복사본만 처리하여 전자책 내용을 PC 라이브러리에 가져오지 않고 사용 가능한 캐시 기록을 내보냅니다. 모든 클라우드 구매 항목이나 모든 리더의 모든 파일을 열거한다는 보장은 아닙니다.
저장소를 기록하고 캐시 복사하기
기기나 관리 폴더가 로컬 Calibre 형식 JSON 캐시를 제공할 때만 사용하세요. 진행 중인 Calibre 기기 검색과 작업이 끝나기를 기다리고, 대상 저장소 및 필터를 지운 Device 보기의 수를 기록한 뒤 캐시를 다시 쓸 수 있는 앱을 닫습니다. 정상 검색은 캐시를 갱신할 수 있지만 변환기는 PC 복사본만 읽습니다. 전체 과정을 읽기 전용으로 유지하는 포렌식 수집 절차는 아닙니다.
캐시를 PC의 새 폴더로 복사하고 metadata-copy.json 이라 이름 붙이되 원본은 제자리에 둡니다. 원래 디렉터리, 저장소 이름과 복사 시각을 기록하세요. 본체와 카드에 각각 캐시가 있다면 서로 다른 출력 이름으로 따로 처리합니다. 읽을 수 있는 캐시가 없으면 이 방법을 중단하고 PC 라이브러리 내보내기를 완전한 기기 목록이라고 부르지 마세요. 이 JSON으로 metadata.db 를 대체하지 않습니다.
캐시 기록 하나를 CSV 한 행으로 내보내기
Python 3가 이미 설치되어 있다면 복사 폴더에서 터미널을 엽니다. Windows에서는 python3 대신 py -3 를 쓰세요. 아래 명령을 곧은 따옴표를 유지하여 한 줄로 복사하고 새 출력 파일명을 선택합니다. 입력은 JSON 배열이며 각 기록의 lpath 가 문자열이어야 합니다. 모든 기록을 보존하고 기존 CSV를 덮어쓰지 않습니다.
python3 -c "import csv,json,sys; r=json.load(open(sys.argv[1],encoding='utf-8-sig')); assert isinstance(r,list) and all(isinstance(b,dict) and isinstance(b.get('lpath'),str) for b in r), 'Expected an array of records with lpath'; f=open(sys.argv[2],'x',encoding='utf-8-sig',newline=''); w=csv.writer(f); w.writerow(['row','lpath','title','authors_json','series','series_index']); w.writerows([[i,b['lpath'],b.get('title'),json.dumps(b.get('authors'),ensure_ascii=False),b.get('series'),b.get('series_index')] for i,b in enumerate(r,1)]); f.close(); print(len(r),'cache rows exported')" "metadata-copy.json" "device-cache.csv"
열은 row, lpath, title, authors_json, series, series_index 입니다. 저자는 한 셀의 JSON 값으로 남아 여러 저자가 행을 늘리지 않습니다. null 은 캐시에 값이 없음을 뜻합니다. row 는 이 스냅샷의 순서이지 영구 책 ID가 아닙니다. 없는 시리즈 값은 빈칸으로, 소수 시리즈 번호는 그대로 남습니다. 잘못된 입력이나 이미 존재하는 대상 파일이면 오류가 납니다. 입력을 확인하거나 새 출력명을 고르고, 원본 캐시를 삭제하여 해결하려 하지 마세요.
텍스트로 가져온 뒤 목록 확인하기
LibreOffice Calc에서 파일 > 열기와 텍스트 CSV를 선택합니다. 텍스트 가져오기에서 UTF-8, 쉼표 구분과 곧은 큰따옴표 문자열 구분을 지정하세요. 구분자 병합, 공백 제거, 수식 평가를 끄고 미리 보기의 여섯 열 모두를 텍스트로 설정한 뒤 확인합니다. 창이 생략되면 파일 열기에서 필터 설정 편집을 켭니다. 이렇게 하면 메타데이터 문자열을 유지하고 = 로 시작하는 제목이 수식이 되는 것을 막습니다.
출력된 캐시 행 수를 머리글 제외 CSV 데이터 행 수와 비교하세요. 그림의 가상 예에서는 경로 두 개가 같아도 기록 세 개가 행 세 개가 되어야 합니다. 따옴표 안의 제목에 줄바꿈이 있을 수 있으므로 텍스트 파일의 물리적 줄 수를 세지 마세요. 조사하기 전에는 중복을 유지합니다. 익숙한 제목, 전체 lpath 와 기록한 원래 저장소의 실제 파일을 확인하세요. 캐시 복사본 위치가 경로의 기준점을 바꾸지는 않습니다.
이 목록이 증명하지 못하는 것
Device 보기 항목이 없거나 수가 다르면 필터, 선택 저장소, 검색 완료 여부와 캐시 시각을 확인하세요. USB 대용량 저장소 드라이버는 설정된 디렉터리와 지원 형식만 검색하며 전체 디스크를 보편적으로 검색하지 않습니다. 오래된 캐시에는 삭제된 파일 기록이 남을 수 있습니다. 같은 제목의 두 형식은 별도 파일 기록이며, 제목이 같아도 같은 책인지 또는 현재 PC 라이브러리에 있는지 증명하지 못합니다.
KOReader도 캐시를 쓰고 간소화할 수 있으므로 사용자 메타데이터 누락이 전자책 소실을 뜻하지는 않습니다. 원본 JSON과 CSV를 함께 보관하고 저장소와 복사 시각을 표시하세요. 이 정확한 변환 명령은 유니코드, 쉼표, 여러 줄 제목, null 저자, 소수 번호, 중복 경로, 빈 배열, 잘못된 입력과 덮어쓰기 거부를 포함한 합성 데이터로 실제 검증했습니다. 실물 리더나 Calc 화면을 시험하지는 않았습니다. 책 백업이나 클라우드 목록이 필요하다면 이 표만으로 충분하지 않습니다.
