기본 콘텐츠로 건너뛰기

추천 가젯

리액트 + 비트(Vite)로 모바일 청첩장 만들기 — 2편

모바일 청첩장 시리즈 2편 · R2 갤러리 & Firebase 방명록 Cloudflare R2 · Functions Firebase Firestore 클라우드플레어 R2로 갤러리 저장하고, Firebase로 방명록 달기 안녕하세요, 병민입니다 🙌 1편에서 전체 흐름을 잡았고, 이번엔 사진 업로드/보관 과 방명록 을 연결합니다. 서버는 따로 없고 Cloudflare Pages 를 쓰고 있으니, Pages Functions (= 워커)로 R2에 사전서명 URL을 만들어주고, 프론트에서 그 URL로 바로 업로드하는 구조예요. 방명록은 Firebase DB로 간단·안전하게! 전체 그림 프론트(React) → /api/r2/upload 로 업로드용 URL 요청 → R2에 파일 PUT 프론트(React) → /api/r2/list 로 목록 요청 → 갤러리 렌더 프론트(React) → Firebase SDK로 방명록 작성/조회 1) R2 버킷 & Pages Functions 준비 Cloudflare 대시보드 > R2 > Create bucket (예: wedding-gallery ) 버킷 > Settings > CORS 에서 사이트 도메인 허용(예: https://*.pages.dev , 커스텀 도메인) Pages 프로젝트 > Settings > Functions 에서 R2 바인딩 추가: ...

파이썬 shutil 완전 정복 📦 — 복사·이동·삭제·압축까지

파이썬 shutil 완전 정복 📦 — 복사·이동·삭제·압축까지 shutil 아이콘

파이썬 shutil 완전 정복 📦

shutil 모듈은 고수준 파일 연산을 제공합니다. 파일/폴더 복사, 이동, 삭제부터 압축 아카이브 생성까지 운영 자동화 스크립트에 꼭 필요한 기능들이 들어있습니다.

1) 파일 복사

import shutil

shutil.copy("a.txt", "b.txt")     # 콘텐츠 복사
shutil.copy2("a.txt", "b2.txt")   # 메타데이터까지 복사
shutil.copyfile("a.txt", "c.txt") # 대상 이름 지정 (메타데이터X)

2) 파일/폴더 이동

import shutil

shutil.move("b.txt", "backup/")   # 파일 이동
shutil.move("mydir", "archive/")  # 디렉터리 이동

3) 디렉터리 트리 복사

import shutil

# 디렉터리 전체 복사
shutil.copytree("src_dir", "dst_dir")

# 기존 dst_dir에 병합하려면 파이썬 3.8+
shutil.copytree("src_dir", "dst_dir", dirs_exist_ok=True)

4) 삭제: rmtree

import shutil, os

# 디렉터리 전체 삭제
shutil.rmtree("old_dir")

# 파일은 os.remove() / Path.unlink() 사용
주의: rmtree는 매우 위험합니다. 항상 경로를 로그로 확인하고, 중요한 경로에서는 dry-run 로직을 추가하세요.

5) 압축/해제

import shutil

# 압축 (형식: zip, tar, gztar, bztar, xztar)
shutil.make_archive("project_backup", "zip", root_dir="project")

# 압축 해제
shutil.unpack_archive("project_backup.zip", extract_dir="restore")

6) 디스크 사용량 확인

import shutil

total, used, free = shutil.disk_usage("/")
print("총 용량:", total//(2**30), "GB")
print("사용 중:", used//(2**30), "GB")
print("남은 용량:", free//(2**30), "GB")

7) 실전 예제

7-1. 특정 확장자만 백업

import shutil, pathlib

src = pathlib.Path("data")
dst = pathlib.Path("backup")
dst.mkdir(exist_ok=True)

for f in src.glob("*.csv"):
    shutil.copy2(f, dst / f.name)

7-2. 주간 로그 아카이브 자동화

import shutil
import datetime

today = datetime.date.today().strftime("%Y%m%d")
shutil.make_archive(f"logs_{today}", "gztar", root_dir="logs")

7-3. 안전 삭제 패턴

import shutil, pathlib

trash = pathlib.Path("output/tmp")
if trash.exists() and trash.is_dir():
    print("삭제할 디렉터리:", trash)
    shutil.rmtree(trash)

요약

  • copy / copy2 / copyfile로 파일 복사
  • move로 이동, copytree로 전체 디렉터리 복사
  • rmtree로 삭제, 반드시 주의 필요
  • make_archive/unpack_archive로 zip/tar 생성·해제
  • disk_usage로 디스크 상태 확인

자주 묻는 질문(FAQ)

Q1. copytree가 symlink도 따라가나요?
A. 기본은 원본 대상 복사입니다. symlinks=True 옵션을 주면 심볼릭 링크 그대로 복사합니다.

Q2. 압축할 때 특정 파일 제외 가능해요?
A. ignore=shutil.ignore_patterns('*.tmp','*.log')를 copytree에 넘겨서 제외할 수 있습니다.

댓글

가장 많이 본 글

Icons by Flaticon