如何编写文件分类移动脚本

wen 实用脚本 28

本文目录导读:

如何编写文件分类移动脚本

  1. 基础版本:按文件扩展名分类
  2. 进阶版本:自定义规则的智能分类器
  3. 简单的批处理版本(Windows)
  4. 使用建议

我来帮你编写一个文件分类移动脚本,这里提供一个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

使用建议

  1. 备份重要数据:运行脚本前先备份重要文件
  2. 测试模式:先在测试文件夹试运行
  3. 自定义规则:根据你的实际需求修改分类规则
  4. 增量分类:可以设置定时任务定期运行

这些脚本可以根据你的具体需求进行修改和扩展,需要帮助调整代码或添加特定功能吗?

抱歉,评论功能暂时关闭!