딸깍 한 번에 완료! 파일 정리 프로그램 만들기: 컴퓨터 속 질서를 만드는 파일 시스템
- 글 재료공학부 3 김종흔
- 편집 에너지자원공학과 4 정영근
서론
여러분의 방은 얼마나 잘 정돈되어 있나요? 옷은 옷장에, 연필은 연필꽂이에 있어야 필요할 때 바로 꺼낼 수 있습니다. 마찬가지로, 컴퓨터 속 파일도 체계적으로 정리되어 있어야 효율적으로 활용할 수 있습니다. 예를 들어 여행 사진은 여행 폴더에, 수업 발표용 PPT는 학교 폴더에 들어 있어야 다시 찾기 쉽겠죠. 이처럼 정보를 잘 수집하는 것만큼이나, 제대로 저장하는 것도 중요합니다. 특히 컴퓨터 속 정보는 실체가 보이지 않기 때문에, 폴더 구조를 어떻게 설계하고 관리하느냐에 따라 효율성이 크게 달라집니다.
저는 늘어나는 사진 파일을 정리하기 위해 '날짜 기반 폴더 정리 프로그램'을 직접 만들어 사용하고 있습니다. 이번 글에서는 이 프로그램을 함께 만들어보며, 컴퓨터 폴더에 파일이 저장되는 방식과 효율적인 정리 원리에 대해 알아보겠습니다.
1. 프로그램 소개: 날짜별 폴더 정리기

1-1. 정리 기준 설정: 효율적인 폴더 구조란?
프로그램을 제작하기 전에, 어떤 폴더 구조가 가장 효율적인지 먼저 생각해볼 필요가 있습니다. 예를 들어, 오늘 촬영한 사진을 정리할 때 '오늘 날짜'에 해당하는 폴더가 탐색기 가장 바깥에 있으면, 사용자는 별도의 클릭 없이 곧바로 해당 폴더에 접근할 수 있어 매우 편리합니다. 이처럼 최근 작업한 파일을 빠르게 찾아야 할 경우, 오늘이나 최근 날짜의 폴더가 상위에 위치해 있는 구조는 작업 효율을 크게 높이죠. 그리고 가까운 시일 내에 다시 열어볼 가능성이 높은 폴더들도 상단에 배치되어 있으면 재접근이 쉬워집니다. 물론 폴더가 지나치게 많아지면 오히려 불편하므로, 탐색기에서 한눈에 확인 가능한 수준인 10개 내외로 폴더 수를 유지하는 것이 좋을 것 같습니다.
예를 들어 오늘이 2025년 7월 22일이라고 할 때, 제가 원하는 폴더 구조는 위 그림과 같습니다.
1-2. 코드 분석: 날짜별로 자동 정리하기
이제부터는 프로그램의 동작 방식을 코드와 함께 살펴보겠습니다. 실행은 먼저 오늘 날짜를 불러오는 것으로 시작합니다.
today = datetime.today()
year, month, day = today.strftime('%Y'), today.strftime('%m'), today.strftime('%d')
이 정보를 바탕으로, 현재 경로에 해당 날짜에 맞는 '년-월' 폴더와 '월-일' 폴더를 생성합니다. 그다음, 오늘이 아닌 날짜의 '월-일' 폴더들을 각자에 해당하는 '년-월' 폴더로 이동시키고, 마지막으로 이번 달이 아닌 '년-월' 폴더들은 해당 연도의 폴더로 정리합니다.
예를 들어, 아래 코드는 오늘 연도와 다른 'xxxx년 xx월' 폴더를 찾아 해당 연도 폴더 안으로 이동시키는 역할을 합니다:
for item in os.listdir(base_path):
if re.match(r'^\d{4}년 \d{1,2}월$', item):
dir_year = item.split('년')[0]
if dir_year != year:
# "xxxx년" 폴더가 없다면, 생성 후 이동
year_folder = os.path.join(base_path, f"{dir_year}년")
os.makedirs(year_folder, exist_ok=True)
shutil.move(os.path.join(base_path, item), year_folder)
이 코드는 주어진 경로의 모든 폴더를 순차적으로 확인하면서, 과거 연도의 '년-월' 폴더를 분류해 해당 연도 폴더로 이동시킵니다. 여기서 말하는 경로(path)란, 특정 파일이나 폴더가 저장된 위치를 문자열로 나타낸 것이며, 사용자가 직접 폴더를 클릭해 들어가는 경로를 컴퓨터가 이해할 수 있도록 표현한 형태입니다.
위와 같은 구조를 약간만 변형해 '월-일' 폴더에도 동일한 정리 로직을 적용할 수 있겠죠! 프로그램을 실행하면 폴더들이 자동으로 재배치되어, 정돈된 구조를 즉시 확인할 수 있습니다.

2. 공학적 원리 소개: 파일 시스템이란 뭘까?

2-1. 자료 구조 비교: 리스트 vs 트리
이번에는 이 프로그램에 담긴 공학적 원리를 살펴보겠습니다. 제가 앞서 날짜 폴더를 정리한 방식은 컴퓨터 공학의 관점에서 '트리(tree) 구조' 자료형으로 이해할 수 있습니다. 트리 구조는 각 폴더(디렉토리)가 부모-자식 관계로 연결된 계층적 구조로, 최상단에는 루트(root) 폴더가 있고 그 아래로 하위 폴더들이 가지처럼 분기됩니다. 이러한 구조 덕분에 사용자는 파일을 주제나 날짜별로 체계적으로 정리하고, 필요한 정보를 빠르게 찾아갈 수 있습니다.
위 그림에서 왼쪽과 같이 구성된 리스트(list) 구조는 데이터를 순차적으로 나열하는 단순한 형태입니다. 순서대로 접근하는 데는 용이하지만, 정보를 여러 단계로 분류하거나 계층적으로 관리하는 데는 한계가 있습니다. 예를 들어 날짜별 폴더를 리스트처럼 일렬로 나열할 경우, 지난달 혹은 작년의 파일을 찾는 데 훨씬 많은 시간이 걸릴 수 있죠. 반대로 트리 구조는 '연도 #x2192; 월 #x2192; 일'처럼 계층을 따라가며 정리되어 있어, 원하는 날짜의 폴더를 더 효율적으로 탐색할 수 있습니다. 이처럼 폴더 구조를 어떻게 설계하느냐에 따라 정보 접근 속도와 정리의 효율성은 크게 달라질 수 있습니다.
2-2. 탐색 방식의 차이: 선형 탐색 vs 분기 탐색
앞서 짧게 언급했듯이 데이터를 어떻게 검색하느냐는 자료 구조에 따라 크게 달라집니다. 먼저 리스트 구조에서는 데이터를 찾기 위해 처음부터 끝까지 차례로 확인하는 선형 탐색(linear search) 방식이 사용됩니다. 구조가 단순해 구현이 쉽지만, 데이터가 많아질수록 검색 시간이 길어지는 단점이 있습니다. 예를 들어 수백 개의 날짜 폴더 중 특정 날짜를 찾기 위해 처음부터 하나씩 확인해야 한다면, 탐색 효율은 급격히 떨어질 수밖에 없습니다.
반면 트리 구조에서는 분기 탐색(branching search) 방식이 가능해집니다. 루트에서 시작해 조건에 따라 가지를 따라가며 탐색하기 때문에, 계층이 잘 정리되어 있을수록 원하는 정보에 더 빠르게 도달할 수 있습니다. 예를 들어 '2024년 12월 3일' 폴더를 찾는다면, '2024년' #x2192; '12월' #x2192; '3일' 순으로 내려가기만 하면 되죠. 이처럼 트리 구조는 검색 속도와 확장성 면에서 유리하며, 파일 시스템과 같이 계층 구조를 가지는 데이터에 적합합니다.
한편, 우리가 만든 폴더 정리 프로그램에서는 아래와 같은 코드로 파일의 날짜를 검사합니다:
for item in os.listdir(base_path):
이 코드는 현재 경로에 있는 모든 파일 및 폴더를 리스트 형태로 불러온 뒤, 처음부터 끝까지 순차적으로 확인합니다. 즉, 트리 구조로 정리된 폴더 구조를 사용하면서도, 내부 탐색은 리스트에 기반한 선형 탐색 방식을 사용하고 있는 것입니다.
이러한 선택에는 두 가지 이유가 있습니다. 첫째로 이 프로그램은 특정 폴더 하나를 찾는 것이 아니라 모든 폴더를 검사하고 분류하는 데 목적이 있습니다. 이 경우 전체를 순회하는 선형 탐색이 오히려 더 단순하고 효율적입니다.
둘째로 구현 난도 측면에서 선형 탐색 방식이 훨씬 간단하고 직관적입니다. os.listdir() 함수로 폴더 목록을 불러와 for 루프를 돌며 조건에 맞는 작업을 수행하는 구조는 파이썬 사용자라면 누구나 쉽게 이해하고 작성할 수 있습니다. 반대로 트리 구조를 직접 구현하거나 재귀적으로 분기 탐색을 수행하려면 코드가 복잡해지고 유지 관리가 어려워질 수 있습니다.
결과적으로 이 프로그램은 트리 구조를 활용해 파일을 구조화하면서도, 내부 로직은 선형 탐색을 통해 실용성과 간결함을 동시에 확보한 사례라 할 수 있습니다. 물론 처리해야 할 폴더 수가 많고, 특정 폴더만 빠르게 찾아야 하는 경우라면 분기 탐색 알고리즘이 더 적합할 수 있겠죠.
결론
우리는 흔히 '정리'를 감각이나 습관의 문제로 생각합니다. 하지만 수백, 수천 개의 파일이 생성되고 쌓이는 디지털 환경에서는 정리 역시 효율성과 알고리즘의 문제가 됩니다.
이번에 만든 정리 프로그램은 단 한 번의 클릭으로 몇 달 치 파일을 체계적으로 정리해줍니다. 이런 효율들이 쌓이면, 결국 작업 시간 단축이라는 실질적인 효과로 이어집니다. 티끌 모아 태산인 법이니까요.
이처럼 공학은 반드시 거대한 기계나 복잡한 회로가 아니더라도, 일상 속 문제에 '체계'를 부여하는 것에서 출발할 수 있습니다. 그리고 그러한 체계는 작은 아이디어에서 시작됩니다.
참고 문헌
- 1. Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.
- 2. Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd ed.). MIT Press.