DaleSchool

아카이브와 압축

입문25분

학습 목표

  • tar로 파일을 묶고 압축하고 풀 수 있다
  • gzip과 bzip2로 단일 파일을 압축할 수 있다
  • zip/unzip으로 다른 운영체제와 호환되는 압축 파일을 다룰 수 있다
  • 다양한 압축 형식을 구분하고 적절히 사용할 수 있다

동작하는 코드

예제 1: tar로 파일 묶기

# 연습용 파일 만들기
mkdir myproject
echo "메인 파일" > myproject/main.py
echo "설정 파일" > myproject/config.yaml
echo "README" > myproject/README.md

tar로 묶기(압축 없이):

tar -cf myproject.tar myproject/
ls -lh myproject.tar

출력:

-rw-r--r--  1 dale staff  10K Jan 15 10:30 myproject.tar

아카이브 내용 확인:

tar -tf myproject.tar

출력:

myproject/
myproject/main.py
myproject/config.yaml
myproject/README.md

예제 2: gzip으로 압축까지

# 묶기 + gzip 압축 (-z 옵션)
tar -czf myproject.tar.gz myproject/
ls -lh myproject.tar.gz

출력:

-rw-r--r--  1 dale staff  512B Jan 15 10:30 myproject.tar.gz

훨씬 작아졌습니다!

# 압축 풀기
tar -xzf myproject.tar.gz

# 다른 위치에 풀기
tar -xzf myproject.tar.gz -C /tmp/

예제 3: zip 형식

# zip 압축 (Windows/Mac 호환)
zip -r myproject.zip myproject/

# 압축 풀기
unzip myproject.zip

# 내용 확인
unzip -l myproject.zip

직접 수정하기

tar 옵션 완전 정복

tar는 옵션 조합이 복잡해 보이지만 패턴을 알면 쉽습니다:

tar [동작] [옵션] [아카이브명] [대상]

동작:
  -c  create (만들기)
  -x  extract (풀기)
  -t  list (목록 보기)

옵션:
  -f  파일 이름 지정 (항상 필요)
  -z  gzip 압축 (.tar.gz)
  -j  bzip2 압축 (.tar.bz2)
  -J  xz 압축 (.tar.xz)
  -v  verbose (진행 상황 출력)
  -C  압축 풀 디렉토리 지정

자주 쓰는 명령어:

# 압축 생성
tar -czf archive.tar.gz directory/   # gzip (.tar.gz)
tar -cjf archive.tar.bz2 directory/  # bzip2 (.tar.bz2)
tar -czf archive.tgz *.txt           # 여러 파일

# 압축 풀기
tar -xzf archive.tar.gz
tar -xjf archive.tar.bz2
tar -xzf archive.tgz -C /target/dir/

# 내용 확인 (풀지 않고)
tar -tzf archive.tar.gz
tar -tjf archive.tar.bz2

# 진행 상황 보면서 생성/풀기
tar -czfv archive.tar.gz large-dir/

단일 파일 gzip 압축

tar는 여러 파일을 묶는 도구이고, gzip은 단일 파일을 압축합니다:

# 파일 압축 (원본이 .gz로 교체됨)
gzip large-file.log
ls
# large-file.log.gz

# 압축 해제
gunzip large-file.log.gz
# 또는
gzip -d large-file.log.gz

# 원본 유지하면서 압축
gzip -k large-file.log
# large-file.log (유지) + large-file.log.gz (새로 생성)

# 압축률 확인
gzip -l large-file.log.gz

bzip2와 xz: 더 높은 압축률

# bzip2 (gzip보다 압축률 높음, 느림)
bzip2 file.txt        # → file.txt.bz2
bunzip2 file.txt.bz2  # → file.txt

# xz (가장 높은 압축률, 가장 느림)
xz file.txt        # → file.txt.xz
unxz file.txt.xz   # → file.txt

압축 형식 비교

| 형식 | 확장자 | 압축률 | 속도 | 호환성 | | ----- | ------ | ------ | ---- | ------------------- | | gzip | .gz | 보통 | 빠름 | 매우 좋음 | | bzip2 | .bz2 | 좋음 | 중간 | 좋음 | | xz | .xz | 최고 | 느림 | 보통 | | zip | .zip | 보통 | 빠름 | 최고 (Windows 지원) |

실무에서 선택 기준:

  • 리눅스/서버 배포: .tar.gz
  • 매우 큰 파일: .tar.xz
  • Windows 사용자와 공유: .zip

"왜?" — 아카이브가 필요한 상황

시나리오 1: 서버 배포

# 프로젝트를 서버에 배포
tar -czf deploy-20260306.tar.gz \
  --exclude='node_modules' \
  --exclude='.git' \
  myproject/

# 서버에 업로드 후 풀기
scp deploy-20260306.tar.gz user@server:/tmp/
ssh user@server "tar -xzf /tmp/deploy-20260306.tar.gz -C /var/www/"

시나리오 2: 로그 파일 보관

# 오래된 로그 압축 보관
tar -czf logs-2025.tar.gz /var/log/app/2025/
rm -r /var/log/app/2025/

# 용량 확인
du -sh logs-2025.tar.gz

시나리오 3: 소프트웨어 설치

# 오픈소스 소프트웨어 다운로드 후 설치
wget https://example.com/software-1.0.tar.gz
tar -xzf software-1.0.tar.gz
cd software-1.0/
./configure && make && sudo make install

흔한 실수

실수 1: tar 옵션 순서

# 잘못됨: -f 다음에 파일명이 와야 함
tar -fczv archive.tar.gz dir/   # -f가 먼저면 다음 인자를 파일명으로 봄

# 올바름: -f를 마지막 옵션으로 (또는 파일명 바로 앞)
tar -czvf archive.tar.gz dir/

실수 2: 절대 경로로 압축해서 해제 시 문제

# 위험: 절대 경로로 압축
tar -czf archive.tar.gz /etc/hosts
# 압축 해제 시 /etc/hosts를 덮어씌울 수 있음!

# 안전: 상대 경로 사용 또는 -C로 이동 후
cd /etc
tar -czf ~/archive.tar.gz hosts

실수 3: gzip으로 이미 압축된 파일 중복 압축

# 이미 .gz인 파일을 tar.gz로 만들 필요 없음
# .jpg, .mp4 같은 이미 압축된 형식도 마찬가지
tar -czf images.tar.gz *.jpg  # 압축 효과 거의 없음
tar -cf images.tar *.jpg      # 그냥 묶기만 하는 게 나음

심화 학습

tar에서 파일 제외하기
# 특정 파일/디렉토리 제외
tar -czf project.tar.gz project/ \
  --exclude='project/node_modules' \
  --exclude='project/.git' \
  --exclude='*.log' \
  --exclude='*.tmp'

배포용 아카이브를 만들 때 불필요한 파일을 제외합니다.

압축 파일 내 특정 파일만 추출
# 압축 내용 확인
tar -tzf archive.tar.gz

# 특정 파일만 추출
tar -xzf archive.tar.gz myproject/config.yaml

# 특정 패턴 파일만 추출
tar -xzf archive.tar.gz --wildcards '*.txt'
pigz로 병렬 압축 가속
# pigz 설치 (parallel gzip)
brew install pigz

# 병렬 압축 (CPU 코어 수만큼 빠름)
tar -I pigz -cf archive.tar.gz large-directory/

# 병렬 해제
tar -I pigz -xf archive.tar.gz

대용량 파일을 자주 압축한다면 pigz를 쓰면 속도가 크게 빨라집니다.

  1. 연습용 디렉토리를 만들고 파일을 몇 개 넣으세요.
  2. tar -czf test.tar.gz 디렉토리/로 압축하세요.
  3. tar -tzf test.tar.gz로 내용을 확인하세요.
  4. 다른 위치에 tar -xzf test.tar.gz -C /tmp/로 풀어보세요.
  5. gzip 파일명으로 단일 파일을 압축하고 ls -lh로 크기를 비교해보세요.

Q1. tar -xzf archive.tar.gz에서 각 옵션의 의미가 올바른 것은?

  • A) -x 만들기, -z gzip, -f 파일 지정
  • B) -x 풀기, -z gzip, -f 파일 지정
  • C) -x 확인, -z 압축, -f 강제
  • D) -x 풀기, -z zip, -f 파일 지정