파일 생성일자로 디렉토리 생성 및 이동
사진 파일, 날짜별 폴더로 자동 정리하기
시놀로지 나스(NAS)를 사용하면서 사진을 일자별 폴더로 꼼꼼하게 관리해 왔었다. 하지만 최근 모멘트(Moments)나 시놀로지 포토(Synology Photos) 같은 앱들은 물리적인 폴더 구조와 상관없이 타임라인 뷰를 제공해주다 보니, 어느 순간부터 귀찮음이 발동해 한 폴더에 사진을 몰아넣기 시작했다.
앱으로 볼 때는 편하지만, 파일 관리를 위해 직접 디렉토리에 접속했을 때는 그야말로 카오스였다. 수천 장의 파일이 한 곳에 나열되어 있으니 관리가 불가능했다.
그래서 “파일의 생성일자를 읽어서, 날짜별(YYYY-MM-DD) 폴더를 만들고 자동으로 이동시키는” 파이썬 스크립트를 작성했다.
파이썬(Python) 스크립트
로직은 간단하다.
-
대상 디렉토리의 파일 리스트를 읽는다.
-
각 파일의 생성(수정) 날짜를 확인한다.
-
2023-05-01과 같은 날짜 이름의 폴더가 없으면 만들고, 있으면 그 안으로 파일을 옮긴다.
시놀로지나 리눅스 환경이라면 SSH로 접속해서 사용하면 되고, 윈도우에서도 파이썬만 깔려있다면 사용 가능하다.
Python
import os
import time
import sys
import shutil
# 실행 시 인자값으로 정리할 디렉토리 경로를 받는다.
if len(sys.argv) < 2:
print("Usage: python organize_photos.py [Target Directory]")
sys.exit(1)
target_dir = sys.argv[1]
# 해당 디렉토리로 이동
try:
os.chdir(target_dir)
except FileNotFoundError:
print(f"Error: The directory '{target_dir}' does not exist.")
sys.exit(1)
# 현재 디렉토리의 모든 항목을 순회
for f in os.listdir("."):
# 디렉토리나 스크립트 자신은 제외하고 '파일'만 처리
if not os.path.isfile(f) or f == os.path.basename(__file__):
continue
try:
# 파일의 수정 시간(mtime)을 가져온다. (Unix에서는 생성시간(birthtime) 얻기가 까다로워 보통 mtime 사용)
ft = time.localtime(os.path.getmtime(f))
# 날짜 형식으로 디렉토리 이름 생성 (예: 2007-03-19)
cdir = "%d-%02d-%02d" % (ft.tm_year, ft.tm_mon, ft.tm_mday)
# 해당 날짜의 디렉토리가 없으면 생성
if not os.path.isdir(cdir):
os.mkdir(cdir)
print(f"Created directory: {cdir}")
# 파일 이동
src_path = f
dest_path = os.path.join(cdir, f)
shutil.move(src_path, dest_path)
print(f"Moved: {f} -> {dest_path}")
except Exception as e:
print(f"Error processing file {f}: {e}")
print("Done.")
사용 방법 (SSH 기준)
-
위 코드를
organize_photos.py라는 이름으로 저장한다. -
SSH를 통해 시놀로지에 접속한다.
-
아래 명령어로 스크립트를 실행한다.
Bash
# 사용법: python [스크립트파일] [정리할_폴더_경로]
python organize_photos.py /volume1/photo/Upload
실행하고 나면 한 곳에 쌓여있던 파일들이 날짜별 방(폴더)을 찾아 깔끔하게 들어가 있는 모습을 볼 수 있다. 묵은 체증이 내려가는 기분이다.
💡 주의사항
-
백업 필수: 대량의 파일을 이동시키는 작업이므로, 만약의 사태를 대비해 중요한 사진은 반드시 백업 후 진행하세요.
-
날짜 기준: 리눅스/유닉스 환경의 파이썬
os.path.getmtime은 ‘마지막 수정 시간’을 가져옵니다. 사진을 찍은 날짜(EXIF 정보)가 아니라 파일이 생성/수정된 날짜 기준이므로, 파일을 복사하거나 가공했다면 날짜가 다를 수 있습니다. (EXIF 기준으로 하려면Pillow라이브러리를 써야 해서 코드가 더 복잡해집니다.)