本文目录导读:

我来帮你编写一个文件分类移动脚本,这里提供一个Python版本的通用文件分类器:
基础版本:按文件扩展名分类
import os
import shutil
from pathlib import Path
def classify_files_by_extension(source_dir, target_dir=None, move=True):
"""
按文件扩展名自动分类文件
:param source_dir: 源文件夹路径
:param target_dir: 目标文件夹路径(默认与源文件夹相同)
:param move: True=移动文件, False=复制文件
"""
# 设置目标目录
if target_dir is None:
target_dir = source_dir
# 定义文件分类规则
file_categories = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg', '.webp'],
'文档': ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.pptx', '.csv'],
'视频': ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv'],
'音频': ['.mp3', '.wav', '.flac', '.aac', '.ogg'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
'代码': ['.py', '.js', '.html', '.css', '.java', '.cpp', '.h'],
'可执行文件': ['.exe', '.msi', '.sh', '.bat'],
}
# 统计信息
stats = {'moved': 0, 'skipped': 0, 'errors': 0}
# 遍历源文件夹
for file in Path(source_dir).iterdir():
if file.is_file():
file_ext = file.suffix.lower()
moved = False
# 查找匹配的类别
for category, extensions in file_categories.items():
if file_ext in extensions:
# 创建分类文件夹
category_path = Path(target_dir) / category
category_path.mkdir(exist_ok=True)
# 目标文件路径
dest_file = category_path / file.name
# 处理重名文件
counter = 1
while dest_file.exists():
name_without_ext = file.stem
dest_file = category_path / f"{name_without_ext}_{counter}{file_ext}"
counter += 1
try:
if move:
shutil.move(str(file), str(dest_file))
print(f"移动: {file.name} -> {category}/")
else:
shutil.copy2(str(file), str(dest_file))
print(f"复制: {file.name} -> {category}/")
stats['moved'] += 1
except Exception as e:
print(f"错误({file.name}): {e}")
stats['errors'] += 1
moved = True
break
# 未分类的文件
if not moved:
print(f"跳过(未分类): {file.name}")
stats['skipped'] += 1
# 输出统计信息
print(f"\n{'='*40}")
print(f"分类完成!")
print(f"处理文件: {stats['moved'] + stats['skipped']}个")
print(f"已分类: {stats['moved']}个")
print(f"跳过: {stats['skipped']}个")
print(f"错误: {stats['errors']}个")
print(f"{'='*40}")
# 使用示例
if __name__ == "__main__":
# 请修改为你的文件夹路径
source_folder = r"C:\Users\YourName\Downloads"
# 移动文件(默认为移动操作)
classify_files_by_extension(source_folder)
# 或者复制文件(不移动原文件)
# classify_files_by_extension(source_folder, move=False)
进阶版本:自定义规则的智能分类器
import os
import shutil
import re
from pathlib import Path
from datetime import datetime
class SmartFileClassifier:
def __init__(self, source_dir):
self.source_dir = Path(source_dir)
self.rules = []
self.default_folder = "其他文件"
def add_rule(self, folder_name, patterns, use_regex=False):
"""
添加分类规则
:param folder_name: 目标文件夹名称
:param patterns: 匹配模式列表(文件名包含的关键字或正则表达式)
:param use_regex: 是否使用正则表达式匹配
"""
self.rules.append({
'folder': folder_name,
'patterns': patterns,
'use_regex': use_regex
})
def classify_by_date(self, file_path):
"""根据文件修改日期分类"""
mtime = file_path.stat().st_mtime
date = datetime.fromtimestamp(mtime)
return date.strftime("%Y-%m"), date # 返回年月和日期对象
def classify_by_size(self, file_path):
"""根据文件大小分类"""
size = file_path.stat().st_size
if size < 1024 * 1024: # < 1MB
return "小文件(<1MB)"
elif size < 100 * 1024 * 1024: # < 100MB
return "中等文件(1-100MB)"
else:
return "大文件(>100MB)"
def match_rules(self, file_name):
"""匹配自定义规则"""
for rule in self.rules:
for pattern in rule['patterns']:
if rule['use_regex']:
if re.search(pattern, file_name, re.IGNORECASE):
return rule['folder']
else:
if pattern.lower() in file_name.lower():
return rule['folder']
return None
def run(self, mode='move'):
"""
执行分类
:param mode: 'move' 或 'copy' 或 'sort_by_date' 或 'sort_by_size'
"""
stats = {'processed': 0, 'moved': 0, 'errors': 0}
for file in self.source_dir.iterdir():
if not file.is_file():
continue
stats['processed'] += 1
file_name = file.name
try:
# 确定目标文件夹
if mode == 'sort_by_date':
folder_name, _ = self.classify_by_date(file)
elif mode == 'sort_by_size':
folder_name = self.classify_by_size(file)
else:
# 先尝试匹配自定义规则
folder_name = self.match_rules(file_name)
if not folder_name:
# 如果没有匹配,按扩展名分类
ext = file.suffix.lower()[1:] if file.suffix else "无扩展名"
folder_name = ext if ext else self.default_folder
# 创建目标文件夹
dest_folder = self.source_dir / folder_name
dest_folder.mkdir(exist_ok=True)
# 目标文件路径
dest_path = dest_folder / file_name
# 处理重名
counter = 1
while dest_path.exists():
name_parts = file.stem.rsplit('_', 1)
if len(name_parts) > 1 and name_parts[-1].isdigit():
new_name = f"{name_parts[0]}_{int(name_parts[-1]) + 1}{file.suffix}"
else:
new_name = f"{file.stem}_{counter}{file.suffix}"
dest_path = dest_folder / new_name
counter += 1
# 执行移动或复制
if mode == 'move':
shutil.move(str(file), str(dest_path))
print(f"移动: {file_name} -> {folder_name}/")
else:
shutil.copy2(str(file), str(dest_path))
print(f"复制: {file_name} -> {folder_name}/")
stats['moved'] += 1
except Exception as e:
print(f"处理失败 {file_name}: {e}")
stats['errors'] += 1
# 输出统计
print(f"\n{'='*40}")
print(f"处理完成!")
print(f"总计文件: {stats['processed']}")
print(f"成功: {stats['moved']}")
print(f"失败: {stats['errors']}")
print(f"{'='*40}")
# 使用示例
if __name__ == "__main__":
# 初始化分类器
classifier = SmartFileClassifier(r"C:\Users\YourName\Downloads")
# 添加自定义规则
classifier.add_rule("重要项目", ["项目A", "项目B", "v1.0"])
classifier.add_rule("报表", ["report", "统计", "数据", "*.xls*", "*.csv"], use_regex=True)
classifier.add_rule("临时文件", ["temp", "tmp", "~"], use_regex=False)
# 执行不同的分类模式
print("=== 按自定义规则和扩展名分类 ===")
classifier.run(mode='move') # 移动文件
# 或者按日期分类
# print("=== 按日期分类 ===")
# classifier.run(mode='sort_by_date')
# 或者按大小分类
# print("=== 按大小分类 ===")
# classifier.run(mode='sort_by_size')
简单的批处理版本(Windows)
@echo off chcp 65001 >nul文件分类工具 set "source_dir=C:\Users\%USERNAME%\Downloads" cd /d "%source_dir%" echo 正在分类文件... REM 创建分类文件夹 mkdir 图片 2>nul mkdir 文档 2>nul mkdir 视频 2>nul mkdir 音频 2>nul mkdir 压缩包 2>nul mkdir 程序 2>nul REM 移动各种格式的文件 move *.jpg *.jpeg *.png *.gif *.bmp 图片\ 2>nul move *.pdf *.doc *.docx *.txt *.xlsx *.pptx 文档\ 2>nul move *.mp4 *.avi *.mkv *.mov *.wmv 视频\ 2>nul move *.mp3 *.wav *.flac *.aac 音频\ 2>nul move *.zip *.rar *.7z *.tar *.gz 压缩包\ 2>nul move *.exe *.msi *.bat *.cmd 程序\ 2>nul echo 分类完成! pause
使用建议
- 备份重要数据:运行脚本前先备份重要文件
- 测试模式:先在测试文件夹试运行
- 自定义规则:根据你的实际需求修改分类规则
- 增量分类:可以设置定时任务定期运行
这些脚本可以根据你的具体需求进行修改和扩展,需要帮助调整代码或添加特定功能吗?