自动分类整理下载文件的脚本

wen 实用脚本 1

本文目录导读:

自动分类整理下载文件的脚本

  1. Python 版本(推荐)
  2. 使用方法
  3. 批量文件整理脚本(Windows Batch)
  4. 使用技巧
  5. 注意事项

我来帮你创建一个自动分类整理下载文件的脚本,这个脚本会根据文件类型自动整理到对应的文件夹中。

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)

使用任务计划程序设置定期运行:

  1. 打开"任务计划程序"
  2. 创建基本任务
  3. 设置触发器和操作(运行Python脚本)

设置定时自动整理(Mac/Linux)

使用crontab:

# 每天凌晨2点运行整理脚本
0 2 * * * python3 /path/to/organize_downloads.py --auto

注意事项

  1. 备份文件:首次运行前建议先备份重要文件
  2. 测试运行:建议先用 --dry-run 模式预览操作
  3. 自定义规则:可以根据需要修改分类规则
  4. 路径选择:确保有足够的磁盘空间

这个脚本提供了完整的分类整理功能,你可以根据实际需求进行调整和扩展。

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