tarfile 모듈로 디렉터리 전체를 tar.gz로 압축하기
파이썬에는 tar 아카이브를 다루기 위한 tarfile 모듈이 기본 내장되어 있습니다. 이 모듈과 os.walk를 함께 사용하면 특정 폴더의 구조를 재귀적으로 순회하면서 그 안의 모든 파일을 하나의 tar 아카이브에 담을 수 있습니다.
전체 코드 예제
import os
import tarfile
def tardir(path, tar_name):
with tarfile.open(tar_name, "w:gz") as tar_handle:
for root, dirs, files in os.walk(path):
for file in files:
tar_handle.add(os.path.join(root, file))
tardir('./my_folder', 'sample.tar.gz')
코드 설명
- tarfile.open(tar_name, "w:gz") — 쓰기 모드("w")에 gzip 압축(":gz")을 적용해 새 아카이브 파일을 생성합니다.
- os.walk(path) — 지정한 경로의 폴더 구조를 재귀적으로 탐색하며, 루트 경로·하위 폴더 목록·파일 목록을 차례로 반환합니다.
- tar_handle.add(...) —
os.path.join으로 조합한 전체 경로의 파일을 아카이브에 하나씩 추가합니다.
with 문을 사용했기 때문에 블록이 종료되는 시점에 아카이브가 자동으로 안전하게 닫히므로, 별도로 close()를 호출할 필요가 없습니다. 위 코드를 실행하면 my_folder의 내용 전체가 sample.tar.gz라는 파일로 압축되어 현재 작업 디렉터리에 저장됩니다.
기존 tar 파일에 새 파일 추가하기
이미 만들어져 있는 tar 아카이브에 파일을 덧붙이려면 추가(append) 모드인 "a"를 사용합니다.
import tarfile
with tarfile.open('sample.tar', 'a') as tar:
tar.add('new_file.txt')
tar.add('another_log.log')
단, 추가 모드는 압축되지 않은 일반 .tar 파일에만 동작한다는 점에 유의하세요. gzip 등으로 압축된 .tar.gz 파일에는 파일을 직접 추가할 수 없으므로, 이 경우 기존 아카이브를 해제한 뒤 다시 묶거나 처음부터 새로 생성해야 합니다.
참고: tarfile에서 지원하는 주요 모드
| 모드 | 설명 |
|---|---|
| w | 압축 없이 일반 tar 파일 생성 |
| w:gz | gzip으로 압축 (.tar.gz / .tgz) |
| w:bz2 | bzip2로 압축 (.tar.bz2) |
| w:xz | xz로 압축 (.tar.xz) |
| a | 기존 tar 파일에 파일 추가 (비압축 tar만 가능) |