중복 파일이 133.03GB라는 보고서가 곧 그만큼 비울 수 있다는 뜻은 아니었다. 프로그램이 계속 쓰는 경로인지, 어떤 사본을 남길지, 여러 이름이 같은 저장 내용을 가리키는지까지 확인해야 했다.
기존 채팅에는 컴퓨터에서 정리할 대상을 찾아 달라는 요청과 조사 결과가 남아 있다. 나는 2026-10-28의 보관된 보고서와 집계 코드를 읽고 원고를 썼다. 당시 우선 정리 후보는 45.43GB였으며, 그 숫자도 실제 삭제로 확보한 공간을 뜻하지 않았다.
중복 합계와 우선 후보는 다른 목록이다
중복 조사에는 같은 내용으로 묶인 998그룹이 있었다. 133.03GB는 각 그룹에서 사본 하나만 남긴다고 가정했을 때 나머지 사본 크기를 합친 수치다. 원본이나 실행 프로그램이 그 경로를 사용하는지까지 해결한 삭제 목록은 아니다.
45.43GB의 우선 목록은 패키지 캐시, 남길 보관본을 확인한 임시 압축파일, 조건에 맞는 오래된 임시자료를 따로 골라 합친 것이다. 중복 목록 일부와 겹치므로 두 숫자를 더하면 같은 파일을 다시 센다. 반대로 두 숫자의 차이를 아직 못 지운 중복 용량으로 설명할 수도 없다. 목록의 기준부터 다르기 때문이다.
이번 집필에서는 우선 목록 CSV의 바이트를 다시 합쳐 보관된 JSON 합계와 대조했다. 일치한 것은 그 기록의 산술이며, 현재 디스크를 새로 조사하거나 그만큼 공간이 늘어났다는 확인은 아니다. GB는 10억 바이트 기준으로 읽었다.
샘플 비교는 후보를 좁히는 단계다
읽은 비교 코드는 16MiB 이상 파일에서 선별한 대상을 먼저 크기로 모은다. 그다음 파일의 일부 위치를 읽어 후보를 좁히고 전체 SHA-256을 비교한다. 샘플은 큰 파일을 덜 읽기 위한 선별 단계이고 전체 내용의 동일성을 대신하는 최종 근거는 아니다.
일부 전체 해시는 앞선 조사에서 보관한 값을 재사용했다. 이때 파일 ID와 크기, 나노초 단위 수정 시각이 현재 메타데이터와 맞는지 확인한다. 새로 읽는 경로에도 조사 뒤 바뀌었는지 확인하는 검사가 있다. 따라서 모든 파일을 매번 새로 끝까지 읽은 조사라고 설명하지 않았다.
비밀·인증 자료와 보호 대상, 접근하지 못한 파일 등은 범위와 예외로 남긴다. 내용이 같다는 판정은 그 비교를 통과한 대상에 관한 기록이다. 전체 컴퓨터의 모든 파일을 같은 깊이로 검사했다거나 현재도 같은 내용이라고 인증하는 결과가 아니다.
경로 수와 저장 단위 수를 나눴다
한 저장장치를 다른 연결 경로로 다시 읽으면 같은 자료가 두 번 집계될 수 있다. 당시 보고서는 별도 드라이브처럼 보이는 연결 경로를 원래 볼륨에 포함해 중복 탐색하지 않았다고 남겼다. 경로 목록의 길이와 실제 저장 단위의 수를 먼저 나눈 것이다.
NTFS 하드링크도 여러 경로가 같은 볼륨의 파일 하나를 가리키는 관계다. Microsoft 문서의 이 설명과 별개로, 실제 집계는 볼륨과 파일 ID로 같은 저장 단위의 경로를 묶는다. 이름이 여러 개라는 이유만으로 각각을 독립된 사본 크기로 더하지 않으려는 처리다.
캐시의 세부 조사에서는 관찰한 경로 수와 링크 수를 비교했다. 목표 범위 밖에도 링크가 남는 저장 단위는 회수 예상 바이트에서 제외했다. 이는 읽은 집계의 조건이다. 파일 크기를 더한 추정이 실제 할당 공간과 정확히 같아진다는 보장은 없으며 압축·할당 단위와 동시 작업도 따로 고려해야 한다.
출처: Microsoft Learn, Hard Links and Junctions.
같은 볼륨의 여러 경로와 파일 하나의 관계를 확인한 공식 설명.
같은 내용이어도 남겨야 할 경로가 있다
같은 해시라도 원본, 설치 프로그램, 모델, 복구 사본의 역할은 다를 수 있다. 보고서 생성 코드는 보호 표식이 있는 저장 단위를 남기고 기준 사본 후보를 별도로 정한다. 목록에는 남길 경로와 보존 또는 보류 이유가 함께 들어간다.
기준 후보의 순위에는 보호 표식·경로 분류·수정 시각을 쓴다. 이 순위만으로 업무상 정본이 정해지지는 않는다. 다른 프로그램의 참조 여부를 모르는 항목은 판단을 보류했다. 같은 내용이 다른 폴더에 있어도 그 프로그램이 새 위치를 알아서 쓰는 것은 아니기 때문이다.
홈페이지 첨부파일도 현재 문서에서 빠졌다는 이유만으로 바로 지울 수는 없었다. 과거 문서와 백업이 필요로 하는 관계를 확인하는 기존 모듈은 이 판단을 설명하는 데 쓸 수 있다. 다만 그 모듈의 참조 메타데이터가 이번 PC의 파일과 하드링크를 실제로 조사해 주는 것은 아니다.
캐시와 설치된 환경의 경계를 정했다
우선 목록의 캐시는 패키지 다운로드·빌드 캐시라는 범위였다. 설치된 프로젝트 환경과 모델, 인증 자료를 함께 정리하는 목록이 아니었다. 패키지 설치나 갱신 작업이 끝났는지 확인하는 조건도 붙었다. 폴더 이름에 캐시가 들어간다는 이유만으로 주변 환경까지 넓혀 지울 수는 없다.
검증용 임시 압축파일은 다른 위치의 남길 보관본과 전체 해시가 맞는지 대조한 뒤 후보에 들어갔다. 후보 행에는 그 보존 경로와 확인 근거가 남는다. 임시라는 이름만 보고 마지막 복구 사본까지 없애는 것과는 다른 순서다.
조사 보고서 자체는 삭제·이동하지 않았다고 기록한다. 같은 채팅에 다른 시점의 정리 완료 기록이 있어도 이 조사 합계를 그때 실제 확보량으로 바꾸지는 않았다. 사본 비교, 후보 검토, 실제 정리와 정리 후 공간 측정은 각각의 시점과 근거를 갖는다.
다음 담당자가 이어 확인할 항목을 남겼다
정리 목록에는 용량과 함께 아래 항목을 적어 둘 수 있다. 보관된 조사 구조를 바탕으로 한 안내이며 새 정리 도구나 실행 결과는 아니다.
이번 글은 원래 조사·해시·정리 스크립트를 실행하지 않고 보고서와 소스를 읽은 기록이다. 현재 파일의 사용 여부나 복구 가능성을 다시 확인한 것도 아니다. 실제 정리 계획에는 검토 범위와 남길 사본이 필요하다. 다음 검토에서는 남길 경로를 사용할 수 있는지, 사용 중인 경로가 후보에 섞였는지, 같은 항목을 두 번 더했는지부터 확인할 수 있다.
- 동일성 근거: 전체 해시와 확인 시점, 과거 해시를 재사용했다면 그 확인 조건.
- 저장 단위: 볼륨·파일 ID와 링크 관계, 목표 범위 밖에 남는 연결.
- 보존 대상: 남길 경로와 그 역할, 아직 확인하지 못한 사용처.
- 집계 범위: 다른 목록과 겹치는 항목, 바이트 합과 회수 추정의 차이.
- 실행 상태: 조사만 했는지, 별도 정리를 했는지, 실제 공간을 언제 측정했는지.