简介:将指定目录下的文件类型过滤出来并复制一份副本到指定目录下,
冲突文件解决方法:自动给冲突文件名上增加序列号,也就是比如:_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
