mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2024-12-18 00:00:14 +00:00
105 lines
4.6 KiB
Python
105 lines
4.6 KiB
Python
import os
|
|
import shutil
|
|
import datetime
|
|
|
|
def categorize_by_size(file_size):
|
|
# Define size categories and their ranges in bytes
|
|
size_categories = {
|
|
'small': (0, 1024), # Up to 1 KB
|
|
'medium': (1025, 1024 * 1024), # 1 KB to 1 MB
|
|
'large': (1024 * 1025, float('inf')) # Larger than 1 MB
|
|
}
|
|
|
|
for category, (min_size, max_size) in size_categories.items():
|
|
if min_size <= file_size < max_size:
|
|
return category
|
|
|
|
return 'unknown'
|
|
|
|
def organize_files(source_dir, destination_dir, organize_by_type=True, organize_by_date=True, organize_by_size=True):
|
|
# Create a dictionary to map file extensions to corresponding folders
|
|
file_types = {
|
|
'images': ['.png', '.jpg', '.jpeg', '.gif'],
|
|
'documents': ['.pdf', '.docx', '.txt'],
|
|
'videos': ['.mp4', '.avi', '.mkv'],
|
|
'other': [] # Add more categories and file extensions as needed
|
|
}
|
|
|
|
# Create destination subdirectories if they don't exist
|
|
if organize_by_type:
|
|
for folder in file_types:
|
|
folder_path = os.path.join(destination_dir, folder)
|
|
os.makedirs(folder_path, exist_ok=True)
|
|
|
|
if organize_by_date:
|
|
for year in range(2010, 2030): # Adjust the range based on your needs
|
|
year_folder = os.path.join(destination_dir, str(year))
|
|
os.makedirs(year_folder, exist_ok=True)
|
|
|
|
for month in range(1, 13):
|
|
month_folder = os.path.join(year_folder, f"{month:02d}")
|
|
os.makedirs(month_folder, exist_ok=True)
|
|
|
|
if organize_by_size:
|
|
for size_category in ['small', 'medium', 'large']:
|
|
size_folder = os.path.join(destination_dir, size_category)
|
|
os.makedirs(size_folder, exist_ok=True)
|
|
|
|
# Scan the source directory and organize files
|
|
for filename in os.listdir(source_dir):
|
|
file_path = os.path.join(source_dir, filename)
|
|
|
|
if os.path.isfile(file_path):
|
|
# Determine the file type based on extension
|
|
file_type = None
|
|
for category, extensions in file_types.items():
|
|
if any(filename.lower().endswith(ext) for ext in extensions):
|
|
file_type = category
|
|
break
|
|
|
|
if organize_by_type and file_type:
|
|
# Move the file to the corresponding subdirectory
|
|
destination_folder = os.path.join(destination_dir, file_type)
|
|
destination_path = os.path.join(destination_folder, filename)
|
|
shutil.move(file_path, destination_path)
|
|
print(f"Moved: {filename} to {file_type} folder")
|
|
|
|
if organize_by_date:
|
|
# Get the creation date of the file
|
|
creation_time = os.path.getctime(file_path)
|
|
creation_date = datetime.datetime.fromtimestamp(creation_time)
|
|
|
|
# Determine the destination folder based on creation date
|
|
destination_folder = os.path.join(
|
|
destination_dir,
|
|
str(creation_date.year),
|
|
f"{creation_date.month:02d}",
|
|
)
|
|
|
|
# Move the file to the corresponding subdirectory
|
|
destination_path = os.path.join(destination_folder, filename)
|
|
shutil.move(file_path, destination_path)
|
|
print(f"Moved: {filename} to {creation_date.year}/{creation_date.month:02d} folder")
|
|
|
|
if organize_by_size:
|
|
# Get the size of the file in bytes
|
|
file_size = os.path.getsize(file_path)
|
|
|
|
# Determine the destination folder based on file size
|
|
size_category = categorize_by_size(file_size)
|
|
destination_folder = os.path.join(destination_dir, size_category)
|
|
destination_path = os.path.join(destination_folder, filename)
|
|
shutil.move(file_path, destination_path)
|
|
print(f"Moved: {filename} to {size_category} folder")
|
|
|
|
# Get source and destination directories from the user
|
|
source_directory = input("Enter the source directory path: ")
|
|
destination_directory = input("Enter the destination directory path: ")
|
|
|
|
# Ask the user how they want to organize the files
|
|
organize_by_type = input("Organize by file type? (yes/no): ").lower() == 'yes'
|
|
organize_by_date = input("Organize by creation date? (yes/no): ").lower() == 'yes'
|
|
organize_by_size = input("Organize by size? (yes/no): ").lower() == 'yes'
|
|
|
|
organize_files(source_directory, destination_directory, organize_by_type, organize_by_date, organize_by_size)
|