[实用py脚本] 批量文件复制迁移到指定目录

简介:将指定目录下的文件类型过滤出来并复制一份副本到指定目录下,
冲突文件解决方法:自动给冲突文件名上增加序列号,也就是比如:_01
复制方法:复制目标文件时创建副本,原文件是保持不变也不会有任何动作改变或者修改,也就是原封不动。

其它操作系统比如Windows使用时路径需要带盘符,比如C:\\,具体看官方文档或者咨询ai

import os
import shutil
from pathlib import Path
 
def get_unique_file_path(target_dir, file_name):
    """
    获取唯一的文件路径,冲突时自动添加_01、_02等序列号后缀
    :param target_dir: 目标文件夹路径
    :param file_name: 原始文件名
    :return: 唯一的目标文件Path对象
    """
    file_path = Path(target_dir) / file_name
    # 若文件不存在,直接返回原路径
    if not file_path.exists():
        return file_path
    # 拆分文件名和后缀,准备生成序列号
    file_stem = file_path.stem  # 文件名(无后缀)
    file_suffix = file_path.suffix  # 文件后缀(含点)
    # 从1开始自增,直到找到不存在的文件名
    serial = 1
    while True:
        # 拼接新文件名:文件名_01.后缀(序列号补两位,统一格式)
        new_file_name = f"{file_stem}_{serial:02d}{file_suffix}"
        new_file_path = Path(target_dir) / new_file_name
        if not new_file_path.exists():
            return new_file_path
        serial += 1
 
def copy_specific_suffix_files(source_dir, target_dir, suffix_list):
    """
    批量复制指定后缀的文件到目标文件夹,冲突时自动重命名避覆盖
    :param source_dir: 源文件夹(安卓文件夹路径)
    :param target_dir: 目标保存文件夹
    :param suffix_list: 要复制的文件后缀列表,如 ['.apk', '.log', '.txt']
    """
    # 统一后缀为小写,避免大小写匹配问题(如.APK和.apk)
    suffix_list = [s.lower() for s in suffix_list]
    # 路径转Path对象,兼容Windows/Linux/macOS/安卓
    source_path = Path(source_dir)
    target_path = Path(target_dir)
 
    # 校验源文件夹是否存在
    if not source_path.exists() or not source_path.is_dir():
        print(f"错误:源文件夹 {source_dir} 不存在或不是有效文件夹!")
        return
 
    # 创建目标文件夹(含子文件夹,已存在则不报错)
    target_path.mkdir(parents=True, exist_ok=True)
    print(f"目标文件夹已准备:{target_path.absolute()}")
 
    # 统计复制数量(普通复制/重命名复制)
    normal_copy_count = 0
    rename_copy_count = 0
 
    # 遍历源文件夹所有文件(含子文件夹)
    for file_path in source_path.rglob("*"):
        # 仅处理文件,跳过文件夹
        if file_path.is_file():
            # 匹配后缀(忽略大小写)
            if file_path.suffix.lower() in suffix_list:
                # 获取唯一目标路径(冲突则重命名)
                target_file = get_unique_file_path(target_path, file_path.name)
                # 复制文件(保留元信息:创建/修改时间)
                shutil.copy2(file_path, target_file)
                # 统计类型
                if target_file.name == file_path.name:
                    normal_copy_count += 1
                    print(f"复制成功:{file_path.name}")
                else:
                    rename_copy_count += 1
                    print(f"重命名复制:{file_path.name} -> {target_file.name}")
 
    # 输出最终统计
    total_count = normal_copy_count + rename_copy_count
    print("=" * 60)
    print(f"批量复制完成!总复制文件:{total_count} 个")
    print(f"✅ 普通复制:{normal_copy_count} 个 | 📝 重命名复制(避冲突):{rename_copy_count} 个")
    print(f"所有文件已保存至:{target_path.absolute()}")
 
# -------------------------- 配置参数(修改这里即可)--------------------------
if __name__ == "__main__":
    # 安卓源文件夹路径(适配AndroidIDE/手机本地路径)
    ANDROID_SOURCE_DIR = r"/storage/emulated/0/文件管理/合并源码/zerostudio新源码/lsp"
    # 目标保存文件夹(安卓本地路径)
    TARGET_SAVE_DIR = r"/storage/emulated/0/文件管理/合并源码/zerostudio新源码/lsp"
    # 要复制的文件后缀(按需添加/删除,必须带点)
    NEED_COPY_SUFFIX = [".kt", ".java"]
    # 执行复制
    copy_specific_suffix_files(ANDROID_SOURCE_DIR, TARGET_SAVE_DIR, NEED_COPY_SUFFIX)

© 版权声明
THE END
喜欢就支持一下吧