ZIP 풀었을 때 폴더가 중복 생성되는 이유와 해결 방법
압축 파일 내부 경로와 추출 대상 폴더의 결합 방식
압축 아카이브 내부의 파일은 단순히 파일 이름만 저장되어 있을 수도 있고, 특정 상위 디렉터리 경로를 포함한 상대경로 형태로 저장되어 있을 수도 있습니다. 파이썬 표준 라이브러리의 zipfile 공식 문서를 살펴보면, ZipFile.namelist() 함수는 아카이브에 포함된 모든 구성 요소의 전체 이름을 있는 그대로 반환합니다. 압축 해제 도구나 추출 함수는 사용자가 지정한 대상 폴더(path) 경로 끝에 아카이브 내부 항목의 상대경로를 덧붙여 실제 파일 시스템에 기록합니다. 따라서 내부 항목 이름이 report/a.txt로 되어 있고 대상 디렉터리를 out으로 지정하면, 결과물은 자연스럽게 out/report/a.txt 위치에 생성됩니다.
폴더가 한 겹 더 생기는 가상 입력과 디렉터리 트리 비교
압축을 해제할 때 사용자가 별도의 상위 폴더를 수동으로 생성하거나 도구의 기본 옵션을 무심코 적용하면 불필요한 중복 폴더가 발생합니다.
압축 안의 항목이 report/a.txt, report/b.txt일 때 out에 풀면 out/report/a.txt와 out/report/b.txt다. 여기에 report라는 새 폴더를 먼저 만들어 그 안에 풀면 report/report가 될 수 있다. 출처 불명 ZIP은 열거나 실행하지 않는다.아카이브 내부에 이미 상위 디렉터리가 포함되어 있는지 여부를 모른 채 새 폴더를 만들고 그 안에서 압축을 풀면 report/report/a.txt처럼 폴더가 두 번 겹쳐 들어갑니다. 반대로 아카이브 내부에 상위 폴더 없이 루트에 여러 파일이 나열되어 있는 상태에서 현재 디렉터리에 그대로 풀면 수많은 파일이 흩어져 기존 작업 파일과 뒤섞이게 됩니다. 상대경로와 절대경로 차이에서 기준 폴더가 달라졌을 때 최종 경로가 바뀌는 원리와 동일합니다. 압축 프로그램마다 메뉴 이름이 각기 다르므로 특정 소프트웨어의 단추 명칭에 의존하지 않고, 압축 내부 구조를 기준으로 대상 폴더를 결정해야 합니다.
압축 풀기 전 내부 경로 목록을 확인하는 안전한 순서
파일 시스템을 어지럽히지 않고 원하는 구조로 압축을 해제하기 위해서는 추출 전에 내부 경로 목록을 미리 조회하는 순서가 필요합니다.
- 내부 파일 목록 확인: 압축 해제 명령을 즉시 내리지 않고,
namelist()함수나 압축 프로그램의 미리보기 목록을 통해 내부 경로 전체를 확인합니다. - 공통 상위 폴더 유무 점검: 목록의 모든 항목이
report/a.txt,report/b.txt처럼 동일한 최상위 디렉터리 명칭으로 시작하는지 판별합니다. - 대상 폴더 결정: 공통 상위 디렉터리가 이미 존재한다면 대상 폴더(
out)를 그대로 지정하고, 파일들이 최상위에 흩어져 있다면 새 폴더(report)를 만들어 그 안을 대상으로 지정합니다. - 추출 후 디렉터리 검증: 추출이 완료된 뒤 생성된 최상위 폴더가 한 겹으로 유지되었는지 디렉터리 구조를 대조합니다.
동일한 이름 파일 충돌 방지와 경로 조작 주의점
압축을 해제하는 대상 디렉터리에 이미 같은 이름을 가진 파일이 있다면 의도치 않은 덮어쓰기가 발생하여 원본 데이터가 훼손될 수 있습니다. 아카이브 내부에 동일한 이름을 가진 파일이 중복 저장되어 있는 경우에도 파일 시스템에 기록되는 과정에서 덮어쓰기가 일어날 수 있습니다. 무엇보다 주의해야 할 점은 출처가 불분명한 파일입니다. 공식 파이썬 문서의 경고에 따르면, 신뢰할 수 없는 출처의 아카이브는 사전 점검 없이 추출해서는 안 됩니다. 상위 디렉터리로 벗어나는 경로 이동(..)이나 절대경로가 포함되어 있을 경우 의도하지 않은 위치에 파일이 쓰이는 경로 탐색 위험이 존재합니다. 파일 이름 오류와 안전한 경로 규칙을 점검하듯, 출처를 알 수 없는 ZIP 파일은 열거나 실행하지 않는 것이 안전합니다.
목록 확인 방식이 검증하지 못하는 기술적 한계
파일 목록을 미리 확인하는 방식은 디렉터리 배치와 충돌을 예방하는 데 유용하지만, 아카이브 자체의 안전성이나 무결성까지 완전히 증명하지는 못합니다.
| 점검 대상 | namelist 확인 가능 여부 | 실제 확인에 필요한 절차 |
|---|---|---|
| 디렉터리 중첩 구조 | 확인 가능 (경로 문자열 대조) | 경로 첫 번째 구성 요소 일치 여부 확인 |
| 파일 압축 데이터 손상 | 확인 불가능 (헤더 목록만 조회) | CRC 체크섬 검사 또는 testzip() 수행 |
| 실제 내용물의 유해성 | 확인 불가능 (파일명 정보만 존재) | 출처 불명 아카이브는 열지 않고 격리 |
| 운영체제 금지 문자 호환 | 확인 불가능 (문자열 유효성 미보장) | 추출 대상 운영체제의 경로 규칙 점검 |
따라서 내부 경로 목록 조회는 폴더 구조를 올바르게 배치하고 실수를 방지하는 1차 점검 절차로 활용해야 하며, 파일 자체의 무결성은 별도의 검증 절차를 통해 확인해야 합니다.
참고 자료와 확인 범위
아래 자료는 형식·기능의 정의를 확인하는 데 사용했습니다. 본문의 예제와 설명은 이 사이트의 작업 상황에 맞춰 구성했습니다. 제품 메뉴는 버전과 언어에 따라 다를 수 있습니다.
확인일: 2026-10-21 · 오류를 발견하면 이 글의 오류 신고로 알려주세요.