Categories
코드

연도와 월로 구별하여 파일 옮기기

컴퓨터 프로그래밍은 삶을 더 편하게 만들 수 있다.이 포스트에서는 파이썬을 통해 파일을 연도별, 월별로 분류하여 정리하는 코드를 소개한다.

작은 도구들이 각자의 역할을 수행하며 하나의 목적을 달성하는 것은 참으로 경이롭다. 예전에 읽었던 어떤 책에서 유닉스(Unix)의 철학이 이와 비슷하다는 글을 읽었다.

Small is beautiful. Make each program do one thing well. Build a prototype as soon as possible.

– Mike Gancarz: The UNIX Philosophy (Wikipedia)

이전에 <슬기로운 저작권 이해> 포스팅에서 얘기했듯이 나는 개인적인 편의를 위해 EBS 라디오 프로그램을 녹음하고 있다. 이를 위해 사용하는 도구는 다음과 같다.

  • Amazon Web Services 클라우드 EC2 서비스의 저렴이 버전인 AWS Lightsail
  • CentOS Linux
  • Bash shell
  • 오픈소스 영상 및 음성 편집도구 ffmpeg
  • Real Time Messaging Protocol(RTMP)로 스트리밍되는 서비스를 mp3 파일로 저장하기 위한 rtmpdump
  • 위 프로그램이 정해진 시간에 동작하도록 하는 crontab
  • 서버 시간에 오차가 없도록 시간을 동기화하는 chrony

그런데 시간이 지날수록 파일은 많아지는데 하나의 폴더에 모든 파일이 있다보니 디렉토리 구조에 체계가 없다는 생각이 들었다. 그래서 디렉토리 구조를 기존 단일 체계에서 연도와 월로 구별하도록 하고 싶었다.

여자 김보성 샛별이 / 출처: <편의점 샛별이>, SBS

어떤 단순한 일을 하는 가장 빠르고 쉬우며 무식한 방법은 인력을 때려밖아서 처리하는 것이다. 때로는 무식한 방법이 통할 때가 있지만, 가급적이면 자동화를 하는 게 편하다. 2018년부터 국내에 본격적으로 도입되기 시작한 RPA(Robotic Process Automation)를 활용하는 것처럼 나는 이 일을 자동화하고 싶었다. 왜냐하면 소위 말하는 노가다로 하기에는 파일이 너무 많고 사람을 사서 쓰기에는 돈이 아까웠기 때문이다.

프랑스에서는 피똥이라고 발음하는 Python을 사용해서 이를 자동화했다. 이게 가능했던 이유는 입력을 아래와 같이 이미 통제할 수 있었기 때문이다.

  • 녹음된 파일은 항상 특정 디렉토리에 저장된다.
  • 파일명에 프로그램이 방송된 연도와 월이 일정하게 포함되어 있다.

이를 위한 코드는 아래와 같으며 year, month 변수와 fnmatch 내 pattern 을 적절하게 수정하면 다른 곳에서도 이를 활용할 수 있다.

import os
import shutil
import pathlib
import fnmatch

with os.scandir('./') as entries:
    for entry in entries:
        year = entry.name[6:10]
        month = entry.name[10:12]
        p = pathlib.Path(year + '/' + month)
        if fnmatch.fnmatch(entry.name, 'power_' + year + month + '*.mp3'):
            p.mkdir(parents=True, exist_ok=True)
            shutil.move('./' + entry.name, './' + year + '/' + month + '/' + entry.name)

파이썬에 익숙하지 않아 관련 함수를 찾아서 익히는 데 수십 분이 걸렸다. 완성된 프로그램을 실행하여 정리하는 데는 1초가 채 걸리지 않았다. 나는 효율적인 사람이 되고 싶고, 이를 위한 최고의 도구는 컴퓨터이기 때문에 나는 컴퓨터가 정말 좋다.

Hits: 254

By 라이언양

라이언양 연구실 주인

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다