实用脚本能自动归类下载文件吗?

wen 实用脚本 1

本文目录导读:

实用脚本能自动归类下载文件吗?

  1. 方案一:基础版(适用于快速归类下载文件夹)
  2. 方案二:按创建日期归类(适合照片、截图)
  3. 方案三:进阶版-自动监控(实时归类)
  4. 方案四:跨平台(Windows/macOS/Linux)- 使用 Bash 脚本
  5. 如何自动触发(定时运行)
  6. 使用建议

是的,完全可以通过脚本实现下载文件的自动归类整理,这类脚本通常被称为文件整理脚本自动化归类脚本,能根据文件后缀、创建时间、大小等规则,将文件移动到对应文件夹。

以下是几个实用且易于实现的方案(从简单到高级):

基础版(适用于快速归类下载文件夹)

这个脚本用 Python 编写,只需几行代码,适合新手。

import os
import shutil
from pathlib import Path
# 1. 设置要整理的文件夹路径(比如浏览器的下载目录)
DOWNLOAD_DIR = Path.home() / "Downloads"  # Windows: C:\Users\你的用户名\Downloads
# 如果想指定其他路径,直接写: DOWNLOAD_DIR = Path("D:/我的下载")
# 2. 定义归类规则:后缀名 -> 目标文件夹名
RULES = {
    # 图片
    ('.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'): '图片',
    # 文档
    ('.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt'): '文档',
    # 视频
    ('.mp4', '.avi', '.mkv', '.mov', '.flv', '.wmv'): '视频',
    # 音频
    ('.mp3', '.wav', '.flac', '.aac', '.ogg'): '音频',
    # 压缩包
    ('.zip', '.rar', '.7z', '.tar', '.gz'): '压缩包',
    # 安装包/程序
    ('.exe', '.msi', '.dmg', '.pkg', '.apk'): '安装程序',
    # 代码/脚本
    ('.py', '.js', '.html', '.css', '.java', '.cpp', '.json', '.xml'): '代码文件',
}
def organize_folder(folder_path):
    """对指定文件夹内的文件进行归类"""
    folder = Path(folder_path)
    if not folder.exists():
        print(f"错误:文件夹 {folder_path} 不存在")
        return False
    moved_count = 0
    for item in folder.iterdir():
        # 只处理文件,跳过文件夹(避免移动子文件夹)
        if not item.is_file():
            continue
        # 获取文件后缀(小写)
        suffix = item.suffix.lower()
        # 查找匹配的规则
        target_dir = None
        for extensions, dir_name in RULES.items():
            if suffix in extensions:
                target_dir = folder / dir_name
                break
        # 如果没匹配到任何规则,放入“其他”文件夹
        if target_dir is None:
            target_dir = folder / "其他"
        # 创建目标文件夹(如果不存在)
        target_dir.mkdir(exist_ok=True)
        # 移动文件(如果目标文件已存在,自动重命名)
        dest_path = target_dir / item.name
        if dest_path.exists():
            # 在文件名后追加时间戳避免覆盖
            import time
            timestamp = int(time.time())
            new_name = f"{item.stem}_{timestamp}{suffix}"
            dest_path = target_dir / new_name
        shutil.move(str(item), str(dest_path))
        print(f"已移动: {item.name} -> {target_dir.name}/")
        moved_count += 1
    print(f"\n归类完成!共移动 {moved_count} 个文件。")
    return True
if __name__ == "__main__":
    # 运行脚本
    organize_folder(DOWNLOAD_DIR)
    # 如果想添加定时任务,可以在这里设置循环
    # input("按回车键退出...")

使用方法:

  1. 安装 Python(如果已安装则跳过)
  2. 将代码保存为 file_organizer.py
  3. 双击运行(或 python file_organizer.py

创建日期归类(适合照片、截图)

有时按后缀不够直观,按日期归类更符合使用习惯:

import os
import shutil
from datetime import datetime
from pathlib import Path
def organize_by_date(source_folder):
    """
    按文件的修改日期归类到 YYYY/MM 文件夹
    2024/03/ 文件夹下存放2024年3月修改的文件
    """
    source = Path(source_folder)
    if not source.exists():
        return
    for item in source.iterdir():
        if not item.is_file():
            continue
        # 获取文件最近修改时间
        mtime = os.path.getmtime(item)
        dt = datetime.fromtimestamp(mtime)
        # 创建 YYYY/MM 层级文件夹
        date_dir = source / str(dt.year) / f"{dt.month:02d}"
        date_dir.mkdir(parents=True, exist_ok=True)
        # 移动文件
        dest = date_dir / item.name
        if dest.exists():
            # 避免重名
            dest = date_dir / f"{item.stem}_{dt.strftime('%Y%m%d%H%M%S')}{item.suffix}"
        shutil.move(str(item), str(dest))
        print(f"移动: {item.name} -> {dt.year}/{dt.month:02d}/")
if __name__ == "__main__":
    organize_by_date(Path.home() / "Downloads")

进阶版-自动监控(实时归类)

如果不希望手动运行,可以创建一个文件监控脚本,当有文件下载完成后自动触发归类。

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from pathlib import Path
class DownloadHandler(FileSystemEventHandler):
    def __init__(self, target_folder, rules, wait_seconds=3):
        self.target_folder = Path(target_folder)
        self.rules = rules
        self.wait_seconds = wait_seconds  # 等待文件写入完成
        self.recent_files = {}
    def on_created(self, event):
        """当新文件创建时被触发"""
        if event.is_directory:
            return
        file_path = Path(event.src_path)
        # 忽略临时文件
        if file_path.suffix.lower() in ('.tmp', '.crdownload', '.part'):
            return
        # 等待一下,确保文件写入完成(下载中文件不处理)
        time.sleep(self.wait_seconds)
        if file_path.exists():
            self.move_file(file_path)
    def move_file(self, file_path):
        """使用预定义的规则移动文件"""
        suffix = file_path.suffix.lower()
        for extensions, dir_name in self.rules.items():
            if suffix in extensions:
                target_dir = self.target_folder / dir_name
                break
        else:
            target_dir = self.target_folder / "其他"
        target_dir.mkdir(exist_ok=True)
        dest = target_dir / file_path.name
        if dest.exists():
            import shutil
            dest = target_dir / f"{file_path.stem}_{int(time.time())}{suffix}"
        file_path.rename(dest)  # 同分区下 rename 更快
        print(f"[监控] 已归类: {file_path.name} -> {dir_name}")
# 使用上述RULES(与方案一相同)
if __name__ == "__main__":
    download_folder = Path.home() / "Downloads"
    event_handler = DownloadHandler(download_folder, RULES)
    observer = Observer()
    observer.schedule(event_handler, str(download_folder), recursive=False)
    observer.start()
    print(f"开始监控: {download_folder}")
    print("按 Ctrl+C 停止...")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

注意: 运行前需安装 watchdog 库:

pip install watchdog

跨平台(Windows/macOS/Linux)- 使用 Bash 脚本

如果你不想用 Python,纯粹的系统命令也可以实现:

Bash 脚本(适用于 macOS/Linux)

#!/bin/bash
# 保存为 organize_downloads.sh
TARGET_DIR="$HOME/Downloads"
# 归类函数
organize() {
    local ext="$1" folder="$2"
    mkdir -p "$TARGET_DIR/$folder"
    find "$TARGET_DIR" -maxdepth 1 -type f -iname "*.$ext" -exec mv {} "$TARGET_DIR/$folder/" \;
}
# 执行归类
organize "jpg" "图片" & organize "png" "图片" & organize "gif" "图片"
organize "pdf" "文档" & organize "doc" "文档" & organize "docx" "文档"
organize "mp4" "视频" & organize "avi" "视频"
organize "zip" "压缩包" & organize "rar" "压缩包"
wait  # 等待所有后台任务完成
echo "归类完成!"

Windows PowerShell 脚本

# 保存为 organize.ps1
$target = "$env:USERPROFILE\Downloads"
# 创建文件夹
@("图片", "文档", "视频", "压缩包", "其他") | ForEach-Object {
    New-Item -ItemType Directory -Path "$target\$_" -Force | Out-Null
}
# 移动文件
Move-Item "$target\*.jpg", "$target\*.png", "$target\*.gif" -Destination "$target\图片\" -ErrorAction SilentlyContinue
Move-Item "$target\*.pdf", "$target\*.doc*", "$target\*.xls*" -Destination "$target\文档\" -ErrorAction SilentlyContinue
Move-Item "$target\*.mp4", "$target\*.avi" -Destination "$target\视频\" -ErrorAction SilentlyContinue
Move-Item "$target\*.zip", "$target\*.rar" -Destination "$target\压缩包\" -ErrorAction SilentlyContinue
Write-Host "归类完成!"

如何自动触发(定时运行)

Windows 用户:

  1. 打开 任务计划程序
  2. 创建基本任务,触发器设为“登录时”或每天固定时间
  3. 操作选择“启动程序”,程序路径设为 python,参数设为脚本路径

macOS/Linux 用户:

使用 crontab

# 每天凌晨2点运行
0 2 * * * /usr/bin/python3 /path/to/your/organize_script.py

浏览器下载完成时自动触发(更精准):

  • Chrome:搭配插件如 Download ManagerAuto Download Organizer
  • QQ 旋风/迅雷:许多下载软件支持“下载完成后运行脚本”

使用建议

  1. 先测试后使用:建议先在小范围文件夹测试,确认规则符合预期。
  2. 分类规则灵活调整:根据自己的使用习惯,增删 RULES 中的条目。
  3. 处理大文件:如果单个文件很大(如几十GB视频),建议移动而不是复制,这样更快。
  4. 备份重要文件:虽然脚本安全,但极少数情况下可能出现意外,第一次使用前建议备份下载文件夹。

如果需要更复杂的规则(如根据文件名关键字、文件大小、权限等归类),告诉我你的具体使用场景,我可以帮你定制脚本。

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