本文目录导读:

我来帮你创建一个自动分类整理下载文件的脚本,这个脚本会根据文件类型自动整理到对应的文件夹中。
Python 版本(推荐)
#!/usr/bin/env python3
"""
自动整理下载文件夹脚本
根据文件类型自动分类到对应文件夹
"""
import os
import shutil
import time
from pathlib import Path
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)
# 文件分类规则
FILE_CATEGORIES = {
# 图片文件
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp', '.ico', '.tiff'],
# 文档文件
'文档': ['.doc', '.docx', '.txt', '.pdf', '.xls', '.xlsx', '.ppt', '.pptx',
'.md', '.rtf', '.odt', '.pages'],
# 压缩包
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz', '.bz2', '.xz'],
# 视频文件
'视频': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm', '.m4v'],
# 音频文件
'音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg', '.m4a', '.wma'],
# 可执行文件
'程序': ['.exe', '.msi', '.dmg', '.pkg', '.deb', '.rpm', '.sh', '.bat', '.app'],
# 开发文件
'开发文件': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.c', '.h',
'.json', '.xml', '.yaml', '.yml', '.sql', '.php', '.rb', '.go'],
# 字体文件
'字体': ['.ttf', '.otf', '.woff', '.woff2', '.eot'],
# 其他
'其他': []
}
class FileOrganizer:
def __init__(self, download_dir=None):
"""初始化整理器"""
if download_dir is None:
# 默认使用系统下载文件夹
download_dir = str(Path.home() / 'Downloads')
self.download_dir = Path(download_dir)
if not self.download_dir.exists():
raise ValueError(f"文件夹不存在: {download_dir}")
def get_category(self, file_ext):
"""根据文件扩展名获取分类"""
file_ext = file_ext.lower()
for category, extensions in FILE_CATEGORIES.items():
if file_ext in extensions:
return category
return '其他'
def create_category_folder(self, category):
"""创建分类文件夹"""
folder = self.download_dir / category
if not folder.exists():
folder.mkdir(parents=True, exist_ok=True)
logger.info(f"创建文件夹: {folder}")
return folder
def organize_file(self, file_path):
"""整理单个文件"""
try:
file_path = Path(file_path)
if file_path.is_dir(): # 跳过文件夹
return None
file_ext = file_path.suffix
category = self.get_category(file_ext)
target_folder = self.create_category_folder(category)
# 处理重名文件
target_path = target_folder / file_path.name
if target_path.exists():
name, ext = os.path.splitext(file_path.name)
counter = 1
while target_path.exists():
target_path = target_folder / f"{name}_{counter}{ext}"
counter += 1
# 移动文件
shutil.move(str(file_path), str(target_path))
logger.info(f"移动: {file_path.name} → {category}/{target_path.name}")
return target_path
except Exception as e:
logger.error(f"处理文件时出错 {file_path}: {e}")
return None
def organize_all_files(self, dry_run=False):
"""整理所有文件"""
files = [f for f in self.download_dir.iterdir() if f.is_file()]
if not files:
logger.info("没有需要整理的文件")
return
logger.info(f"找到 {len(files)} 个文件需要整理")
if dry_run:
logger.info("*** 预演模式(不实际移动文件)***")
for file_path in files:
category = self.get_category(file_path.suffix)
logger.info(f"将移动: {file_path.name} → {category}/")
else:
moved_count = 0
for file_path in files:
if self.organize_file(file_path):
moved_count += 1
logger.info(f"整理完成,共移动 {moved_count} 个文件")
def organize_old_files(self, days=30, dry_run=False):
"""整理N天前的文件(清理旧文件)"""
cutoff_time = time.time() - (days * 24 * 3600)
files = []
for f in self.download_dir.iterdir():
if f.is_file() and f.stat().st_mtime < cutoff_time:
files.append(f)
if not files:
logger.info(f"没有找到超过 {days} 天的文件")
return
logger.info(f"找到 {len(files)} 个超过 {days} 天的文件")
self.organize_selected_files(files, dry_run)
def organize_selected_files(self, files, dry_run=False):
"""整理选定的文件列表"""
if dry_run:
for file_path in files:
category = self.get_category(file_path.suffix)
logger.info(f"将移动: {file_path.name} → {category}/")
else:
moved_count = 0
for file_path in files:
if self.organize_file(file_path):
moved_count += 1
logger.info(f"整理完成,共移动 {moved_count} 个文件")
def main():
# 命令行参数解析
import argparse
parser = argparse.ArgumentParser(description='自动整理下载文件夹')
parser.add_argument('--path', '-p',
help='要整理的文件夹路径(默认为系统下载文件夹)')
parser.add_argument('--dry-run', '-d',
action='store_true',
help='预演模式,只显示将执行的操作,不实际移动文件')
parser.add_argument('--time', '-t',
type=int, metavar='DAYS',
help='只整理N天前的文件')
parser.add_argument('--auto', '-a',
action='store_true',
help='自动模式,无需确认直接执行')
args = parser.parse_args()
try:
# 创建整理器
organizer = FileOrganizer(args.path)
logger.info(f"开始整理文件夹: {organizer.download_dir}")
# 根据参数执行不同的整理方式
if args.time:
# 整理指定天数前的文件
organizer.organize_old_files(days=args.time, dry_run=args.dry_run)
else:
# 整理所有文件
if not args.dry_run and not args.auto:
response = input("确定要整理所有文件吗?(y/n): ")
if response.lower() != 'y':
logger.info("操作已取消")
return
organizer.organize_all_files(dry_run=args.dry_run)
except ValueError as e:
logger.error(f"错误: {e}")
except KeyboardInterrupt:
logger.info("\n操作已中断")
except Exception as e:
logger.error(f"发生未预期的错误: {e}")
if __name__ == '__main__':
main()
使用方法
保存脚本
将上述代码保存为 organize_downloads.py
基本使用
# 整理下载文件夹(默认) python organize_downloads.py # 整理指定文件夹 python organize_downloads.py --path /path/to/folder # 预演模式(只显示将要移动的文件,不实际移动) python organize_downloads.py --dry-run # 整理30天前的文件 python organize_downloads.py --time 30 # 自动模式(跳过确认提示) python organize_downloads.py --auto
批量文件整理脚本(Windows Batch)
@echo off下载文件夹整理工具
chcp 65001 >nul
color 0A
echo.
echo ========================================
echo 下载文件夹整理工具
echo ========================================
echo.
set "downloads=%USERPROFILE%\Downloads"
if not exist "%downloads%" (
echo 下载文件夹不存在!
pause
exit /b
)
cd /d "%downloads%"
echo 开始整理下载文件夹...
echo.
rem 创建分类文件夹
for %%d in (图片 文档 视频 音频 程序 压缩包 其他) do (
if not exist "%%d" mkdir "%%d"
)
rem 整理图片
for %%i in (*.jpg *.jpeg *.png *.gif *.bmp *.svg *.webp *.ico) do (
if exist "%%i" move "%%i" "图片\" 2>nul && echo 移动图片: %%i
)
rem 整理文档
for %%i in (*.doc *.docx *.txt *.pdf *.xls *.xlsx *.ppt *.pptx *.md) do (
if exist "%%i" move "%%i" "文档\" 2>nul && echo 移动文档: %%i
)
rem 整理视频
for %%i in (*.mp4 *.avi *.mkv *.mov *.wmv *.flv *.webm) do (
if exist "%%i" move "%%i" "视频\" 2>nul && echo 移动视频: %%i
)
rem 整理音频
for %%i in (*.mp3 *.wav *.flac *.aac *.ogg *.m4a) do (
if exist "%%i" move "%%i" "音频\" 2>nul && echo 移动音频: %%i
)
rem 整理程序
for %%i in (*.exe *.msi *.dmg *.pkg *.bat) do (
if exist "%%i" move "%%i" "程序\" 2>nul && echo 移动程序: %%i
)
rem 整理压缩包
for %%i in (*.zip *.rar *.7z *.tar *.gz *.bz2) do (
if exist "%%i" move "%%i" "压缩包\" 2>nul && echo 移动压缩包: %%i
)
echo.
echo 整理完成!
echo.
pause
使用技巧
添加自定义分类
在Python脚本中,你可以轻松添加新的文件类型:
# 添加新的分类
FILE_CATEGORIES = {
# ... 现有分类
# 新增加课程文件
'课程资料': ['.ppt', '.pptx', '.doc', '.docx', '.pdf'],
# 添加设计文件
'设计文件': ['.psd', '.ai', '.xd', '.fig', '.sketch'],
}
设置定时自动整理(Windows)
使用任务计划程序设置定期运行:
- 打开"任务计划程序"
- 创建基本任务
- 设置触发器和操作(运行Python脚本)
设置定时自动整理(Mac/Linux)
使用crontab:
# 每天凌晨2点运行整理脚本 0 2 * * * python3 /path/to/organize_downloads.py --auto
注意事项
- 备份文件:首次运行前建议先备份重要文件
- 测试运行:建议先用
--dry-run模式预览操作 - 自定义规则:可以根据需要修改分类规则
- 路径选择:确保有足够的磁盘空间
这个脚本提供了完整的分类整理功能,你可以根据实际需求进行调整和扩展。