์๋ ํ์ธ์, ์ฝ๋ฉ ์ด๋ณด์ ์ฌ๋ฌ๋ถ! ๐ ์ฌ๋ฌ๋ถ์ ๋ค์ด๋ก๋ ํด๋๋ ํน์ ๋์ฅํ์ด ๋์ด ์์ง๋ ์๋์? ์๋ง์ ํ์ผ๋ค์ด ๋ค์์ฌ ์ํ๋ ํ์ผ์ ์ฐพ์ ๋๋ง๋ค ํ์จ๋ถํฐ ๋์ค์ง ์์ผ์ ๊ฐ์? ๐ซ
๊ฑฑ์ ๋ง์ธ์! ์ค๋ ์ฐ๋ฆฌ๋ **ํ์ด์ฌ(Python)**์ ์ฌ์ฉํด์ ์ด ๋ณต์กํ ํด๋๋ฅผ ๋จ ๋ช ์ค์ ์ฝ๋๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ฃผ๋ ๋ง๋ฒ ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฑฐ์์! ๐ช ์ฝ๋ฉ์ ์ ํ ๋ชฐ๋ผ๋ ๊ด์ฐฎ์์. ์์ ๋ฅผ ์ค์ฌ์ผ๋ก ์์ฃผ ์ฝ๊ฒ ์ค๋ช ํด ๋๋ฆด๊ฒ์. ์, ๊ทธ๋ผ ์์ํด ๋ณผ๊น์? ๐
๐ ํ์ด์ฌ ํ์ผ ์ ๋ฆฌ ์คํฌ๋ฆฝํธ ๋ง๋ค๊ธฐ: ์ฒซ ๊ฑธ์!
์ฐ๋ฆฌ์ ๋ชฉํ๋ ํน์ ํด๋(์: ๋ค์ด๋ก๋ ํด๋) ์์ ์๋ ํ์ผ๋ค์ ํ์ผ ์ ํ๋ณ๋ก ์๋์ผ๋ก ๋ถ๋ฅํ์ฌ ํด๋น ํด๋ ์์ ์์ฑ๋ ํ์ ํด๋(์: Images, Docs, Videos)๋ก ์ฎ๊ธฐ๋ ๊ฑฐ์์.
1. ํ์ํ ์ค๋น๋ฌผ ๐ง
์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ฑ ๋ ๊ฐ์ง ํ์ด์ฌ ๋ชจ๋๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
os: **์ด์์ฒด์ (Operating System)**์ ์ํธ์์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋์ ๋๋ค. ํด๋๋ฅผ ๋ง๋ค๊ฑฐ๋ ํ์ผ ๋ชฉ๋ก์ ํ์ธํ๋ ๋ฑ์ ์์ ์ ํ ๋ ์ฌ์ฉํด์.shutil: ํ์ผ ๋ฐ ํด๋ ๋ณต์ฌ, ์ด๋ ๋ฑ ๊ณ ๊ธ ํ์ผ ์์ ์ ์ฝ๊ฒ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ชจ๋์ ๋๋ค.
๐ก ์ฐธ๊ณ : ์ด ๋ ๋ชจ๋์ ํ์ด์ฌ์ ์ค์นํ๋ฉด ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ฏ๋ก ๋ฐ๋ก ์ค์นํ ํ์๊ฐ ์์ด์!
2. ๊ธฐ๋ณธ ์ฝ๋ ๊ตฌ์กฐ ์ก๊ธฐ ๐️
๋จผ์ , ํ์ผ์ ์ ๋ฆฌํ ๊ธฐ์ค ํด๋๋ฅผ ์ ํ๊ณ , ํ์ํ ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
import os
import shutil
# ๐งน ์ ๋ฆฌํ ๋์ ํด๋ ๊ฒฝ๋ก ์ค์ (์ฌ๋ฌ๋ถ์ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝํด ์ฃผ์ธ์!)
TARGET_DIR = "/Users/์ฌ์ฉ์์ด๋ฆ/Downloads"
3. ํ์ผ ๋ถ๋ฅ ๊ธฐ์ค ์ ์ํ๊ธฐ ๐ท️
์ด๋ค ํ์ฅ์๋ฅผ ์ด๋ค ํด๋๋ก ์ฎ๊ธธ์ง ๋ฏธ๋ฆฌ ์ ํด์ผ๊ฒ ์ฃ ? ์ฐ๋ฆฌ๋ ํ์ด์ฌ์ **๋์ ๋๋ฆฌ(Dictionary)**๋ฅผ ์ฌ์ฉํด์ ๋ถ๋ฅ ๊ธฐ์ค์ ์ ์ํ ๊ฑฐ์์.
# ํ์ผ ํ์ฅ์์ ์ ๋ฆฌ๋ ํด๋ ์ด๋ฆ์ ๋งคํ
FILE_TYPES = {
"Images": ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.heic'],
"Docs": ['.pdf', '.docx', '.xlsx', '.pptx', '.txt', '.hwp'],
"Videos": ['.mp4', '.mov', '.avi', '.mkv', '.wmv'],
"Archives": ['.zip', '.rar', '.7z', '.tar', '.gz'],
"Code": ['.py', '.html', '.css', '.js', '.json', '.xml'],
"Music": ['.mp3', '.wav', '.flac'],
# ๐ ๊ธฐํ ํ์ผ์ 'Others' ํด๋๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
}
4. ํต์ฌ ๋ก์ง: ํ์ผ ์ด๋์ํค๊ธฐ ➡️
์ด์ ์ค์ ๋ก ํ์ผ์ ํ๋์ฉ ํ์ธํ๊ณ ์ด๋์ํค๋ ํต์ฌ ์ฝ๋๋ฅผ ์์ฑํ ์ฐจ๋ก์ ๋๋ค.
A. ํด๋ ๋ด ๋ชจ๋ ํ์ผ ํ์ธํ๊ธฐ
os.listdir() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๊ฒฝ๋ก(TARGET_DIR)์ ์๋ ๋ชจ๋ ํ์ผ๊ณผ ํด๋ ์ด๋ฆ์ ๋ฆฌ์คํธ๋ก ๊ฐ์ ธ์ฌ ์ ์์ด์.
# ๐ ๋์ ํด๋์ ๋ชจ๋ ํ์ผ/ํด๋ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
files = os.listdir(TARGET_DIR)
B. ํ์ผ ํ์ฅ์์ ๋ฐ๋ผ ๋ถ๋ฅํ๊ณ ์ด๋ํ๊ธฐ
์ด์ ๋ฐ๋ณต๋ฌธ(for ๋ฃจํ)์ ์ฌ์ฉํด์ ๋ฆฌ์คํธ์ ํ์ผ๋ค์ ํ๋์ฉ ์ฒ๋ฆฌํฉ๋๋ค.
for filename in files:
# ๐ก ํ์ผ์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ง๋ญ๋๋ค.
source_path = os.path.join(TARGET_DIR, filename)
# ๐ ํด๋๋ ๊ฑด๋๋ฐ๊ณ ํ์ผ๋ง ์ฒ๋ฆฌํฉ๋๋ค.
if os.path.isdir(source_path):
continue
# ๐ท️ ํ์ผ์ ํ์ฅ์๋ฅผ ์๋ฌธ์๋ก ๊ฐ์ ธ์ต๋๋ค.
# (์: 'document.PDF' -> '.pdf')
file_extension = os.path.splitext(filename)[1].lower()
# ํ์ผ์ ์ฎ๊ธธ ํด๋ ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ์ 'Others')
dest_folder_name = "Others"
# ๐ FILE_TYPES ๋์
๋๋ฆฌ๋ฅผ ๋๋ฉฐ ํด๋น ํ์ฅ์๋ฅผ ๊ฐ์ง ํด๋๋ฅผ ์ฐพ์ต๋๋ค.
for folder, extensions in FILE_TYPES.items():
if file_extension in extensions:
dest_folder_name = folder
break # ์ฐพ์์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋ฉ์ถฅ๋๋ค.
# ๐ฏ ์ต์ข
๋ชฉ์ ์ง ํด๋์ ๊ฒฝ๋ก๋ฅผ ๋ง๋ญ๋๋ค.
destination_dir = os.path.join(TARGET_DIR, dest_folder_name)
# ⬇️ ๋ชฉ์ ์ง ํด๋๊ฐ ์์ผ๋ฉด ์๋ก ๋ง๋ญ๋๋ค. (os.makedirs๋ ์ด๋ฏธ ์์ด๋ ์ค๋ฅ X)
os.makedirs(destination_dir, exist_ok=True)
# ๐ ํ์ผ ์ด๋ ์คํ!
destination_path = os.path.join(destination_dir, filename)
shutil.move(source_path, destination_path)
print(f"✅ {filename} -> {dest_folder_name} ํด๋๋ก ์ด๋ ์๋ฃ!")
✨ ์ต์ข ํ์ด์ฌ ์คํฌ๋ฆฝํธ (Full Code)
์์ ๋ชจ๋ ์กฐ๊ฐ์ ํฉ์น๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊น๋ํ ํ์ผ ์ ๋ฆฌ ์คํฌ๋ฆฝํธ๊ฐ ์์ฑ๋ฉ๋๋ค! ์ด ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ file_organizer.py๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํด ๋ณด์ธ์.
import os
import shutil
def organize_files(target_dir):
# --- 1. ํ๊ฒฝ ์ค์ ---
# ํ์ผ ํ์ฅ์์ ์ ๋ฆฌ๋ ํด๋ ์ด๋ฆ์ ๋งคํ
FILE_TYPES = {
"Images": ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.heic'],
"Docs": ['.pdf', '.docx', '.xlsx', '.pptx', '.txt', '.hwp'],
"Videos": ['.mp4', '.mov', '.avi', '.mkv', '.wmv'],
"Archives": ['.zip', '.rar', '.7z', '.tar', '.gz'],
"Code": ['.py', '.html', '.css', '.js', '.json', '.xml'],
"Music": ['.mp3', '.wav', '.flac'],
}
# ๐ ๋์ ํด๋์ ๋ชจ๋ ํ์ผ/ํด๋ ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
try:
files = os.listdir(target_dir)
print(f"๐ '{target_dir}' ํด๋์ ํ์ผ {len(files)}๊ฐ๋ฅผ ํ์ธํฉ๋๋ค.")
except FileNotFoundError:
print(f"❌ ์ค๋ฅ: ์ง์ ๋ ๊ฒฝ๋ก '{target_dir}'๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.")
return
# --- 2. ํ์ผ ์ฒ๋ฆฌ ๋ก์ง ---
moved_count = 0
for filename in files:
source_path = os.path.join(target_dir, filename)
# 1. ํด๋๋ ๊ฑด๋๋ฐ๊ธฐ
if os.path.isdir(source_path):
continue
# 2. ํ์ฅ์ ์ถ์ถ ๋ฐ ๋ถ๋ฅ
file_extension = os.path.splitext(filename)[1].lower()
dest_folder_name = "Others" # ๊ธฐ๋ณธ ํด๋
for folder, extensions in FILE_TYPES.items():
if file_extension in extensions:
dest_folder_name = folder
break
# 3. ๋ชฉ์ ์ง ๊ฒฝ๋ก ์ค์ ๋ฐ ํด๋ ์์ฑ
destination_dir = os.path.join(target_dir, dest_folder_name)
os.makedirs(destination_dir, exist_ok=True)
# 4. ํ์ผ ์ด๋
destination_path = os.path.join(destination_dir, filename)
try:
# ๐ ์ด๋ฏธ ๊ฐ์ ์ด๋ฆ์ ํ์ผ์ด ๋ชฉ์ ์ง์ ์๋ค๋ฉด ์ด๋ํ์ง ์์ต๋๋ค.
if os.path.exists(destination_path):
print(f"⚠️ {filename}: ๋ชฉ์ ์ง์ ๊ฐ์ ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ์ฌ ๊ฑด๋๋๋๋ค.")
continue
shutil.move(source_path, destination_path)
moved_count += 1
# print(f"✅ {filename} -> {dest_folder_name} ํด๋๋ก ์ด๋") # ์ด๋ ๋ก๊ทธ๋ ์ ํ ์ฌํญ
except Exception as e:
print(f"❗ {filename} ์ด๋ ์ค ์ค๋ฅ ๋ฐ์: {e}")
# --- 3. ๊ฒฐ๊ณผ ์ถ๋ ฅ ---
print("\n--- ์ ๋ฆฌ ๊ฒฐ๊ณผ ---")
print(f"✨ ์ด {moved_count}๊ฐ์ ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ๋ฆฌ๋์์ต๋๋ค! ✨")
print("์ด์ ํด๋๊ฐ ํจ์ฌ ๊นจ๋ํด์ก์ ๊ฑฐ์์! ๐")
# ๐ ์คํฌ๋ฆฝํธ ์คํ!
# ์ด๊ณณ์ ์ฌ๋ฌ๋ถ์ ์ค์ ๋ค์ด๋ก๋ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด์ฃผ์ธ์.
DOWNLOADS_PATH = "/Users/์ฌ์ฉ์์ด๋ฆ/Downloads" # <--- ์ด ๋ถ๋ถ์ ๊ผญ ์์ ํ์ธ์!
# (์: Windows ์ฌ์ฉ์: "C:\\Users\\์ฌ์ฉ์์ด๋ฆ\\Downloads")
if __name__ == "__main__":
organize_files(DOWNLOADS_PATH)
๐ป ์คํฌ๋ฆฝํธ ์คํ ๋ฐฉ๋ฒ
์์ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ
file_organizer.py๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํฉ๋๋ค.์คํฌ๋ฆฝํธ ์๋จ์ ์๋
DOWNLOADS_PATH๋ณ์์ ๊ฐ์ ์ฌ๋ฌ๋ถ์ ์ค์ ๋ค์ด๋ก๋ ํด๋ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ๋ ์์ง ๋ง์ธ์!ํฐ๋ฏธ๋(Terminal) ๋๋ ๋ช ๋ น ํ๋กฌํํธ(Command Prompt)๋ฅผ ์ด๊ณ , ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฅ๋ ์์น๋ก ์ด๋ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํฉ๋๋ค.
python file_organizer.py
์ ์ ํ, ํ๋ฉด์ ์ ๋ฆฌ ๋ก๊ทธ๊ฐ ํ์๋๊ณ ์ฌ๋ฌ๋ถ์ ๋ค์ด๋ก๋ ํด๋๋ ์ ๊ฐ์ด ๊น๋ํ๊ฒ ์ ๋ฆฌ๋์ด ์์ ๊ฑฐ์์! ๐
๐ ์ด๋ณด์๋ฅผ ์ํ ์ถ๊ฐ ํ!
ํ 1. ํ์ฅ์ ์ถ๊ฐ/์์ ํ๊ธฐ
ํน์ ์ฌ๋ฌ๋ถ์ด ์์ฃผ ์ฌ์ฉํ๋ ํ์ผ ์ ํ(์: ๋์์ธ ํ์ผ์ธ .psd, .ai)์ด ์๋ค๋ฉด, FILE_TYPES ๋์
๋๋ฆฌ์ ์๋ก์ด ํญ๋ชฉ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๋ชฉ๋ก์ ํ์ฅ์๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
# 'Design' ํด๋๋ฅผ ์๋ก ์ถ๊ฐํ๊ณ ํ์ฅ์๋ฅผ ๋ฃ์ต๋๋ค.
FILE_TYPES = {
# ... (๊ธฐ์กด ๋ชฉ๋ก)
"Design": ['.psd', '.ai', '.xd'],
# ...
}
ํ 2. ์คํฌ๋ฆฝํธ ์๋ ์คํ ์ค์
๋งค๋ฒ ์๋์ผ๋ก ์คํํ๊ธฐ ๊ท์ฐฎ๋ค๋ฉด, ์๋์ฐ์ ์์ ์ค์ผ์ค๋ฌ๋ ๋งฅ/๋ฆฌ๋ ์ค์ Crontab ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋งค์ผ ์ ๋ 10์์ฒ๋ผ ์ํ๋ ์๊ฐ์ ์ด ์คํฌ๋ฆฝํธ๊ฐ ์๋์ผ๋ก ์คํ๋๋๋ก ์ค์ ํ ์ ์์ด์. ํ ๋ฒ ์ค์ ํด๋๋ฉด ์์ํ ๊น๋ํ ํด๋๋ฅผ ์ ์งํ ์ ์๋ต๋๋ค! ๐ฅณ
์ด์ ์ฌ๋ฌ๋ถ์ ํ์ด์ฌ์ ์ด์ฉํด ์ผ์์ ์์ ๋ถํธํจ์ ํด๊ฒฐํ๋ ์ฒซ ๋ฒ์งธ ์๋ํ ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์์ํ์ต๋๋ค! ๋ฉ์ ธ์! ๐ ์ด ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๋ ๋ง์ ํ์ด์ฌ ์๋ํ์ ๋์ ํด ๋ณด์ธ์!

๋๊ธ
๋๊ธ ์ฐ๊ธฐ