找回密码
 立即注册
搜索
热搜: Excel discuz
查看: 8|回复: 1

[项目代码] 遍历当前目录,文件夹和文件名超过50个字符,自动修改到30

[复制链接]

504

主题

8万

元宝

81万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
810154
发表于 前天 12:47 | 显示全部楼层 |阅读模式
[code]import os
import shutil


def rename_long_names_recursive(max_length=50, keep_length=50):
    """
    递归检查并重命名当前文件夹及所有子文件夹中名称超过指定长度的文件和文件夹

    Args:
        max_length: 最大允许的字符数,默认50
        keep_length: 保留的字符数,默认30
    """
    current_dir = os.getcwd()
    renamed_count = 0
    total_checked = 0
    renamed_files = []
    renamed_dirs = []

    print(f"开始递归扫描: {current_dir}")
    print(f"阈值: 名称超过 {max_length} 个字符")
    print("-" * 80)

    # 首先收集所有需要重命名的项目(避免在遍历过程中修改目录结构)
    items_to_rename = []

    for root, dirs, files in os.walk(current_dir, topdown=False):  # topdown=False 从底部开始遍历
        # 检查文件夹
        for dir_name in dirs:
            dir_path = os.path.join(root, dir_name)
            if len(dir_name) > max_length:
                items_to_rename.append(('dir', dir_path, dir_name, root))

        # 检查文件
        for file_name in files:
            file_path = os.path.join(root, file_name)
            if len(file_name) > max_length:
                items_to_rename.append(('file', file_path, file_name, root))

    print(f"发现 {len(items_to_rename)} 个需要重命名的项目")
    print("-" * 80)

    # 然后执行重命名
    for item_type, item_path, item_name, root in items_to_rename:
        total_checked += 1

        # 生成新名称
        name, ext = os.path.splitext(item_name)
        new_name = name[:keep_length] + ext

        # 处理重名情况
        counter = 1
        original_new_name = new_name
        new_path = os.path.join(root, new_name)

        while os.path.exists(new_path) and new_path != item_path:
            base_name, ext = os.path.splitext(original_new_name)
            new_name = f"{base_name}_{counter}{ext}"
            new_path = os.path.join(root, new_name)
            counter += 1

        try:
            os.rename(item_path, new_path)
            renamed_count += 1
            item_type_cn = "文件夹" if item_type == 'dir' else "文件"
            renamed_files.append(new_name) if item_type == 'file' else renamed_dirs.append(new_name)

            relative_path = os.path.relpath(root, current_dir)
            if relative_path == '.':
                relative_path = '当前目录'

            print(f"✓ [{item_type_cn}] 重命名: '{item_name}' → '{new_name}'")
            print(f"  位置: {relative_path}")

        except Exception as e:
            print(f"✗ 重命名失败: '{item_name}' - 错误: {e}")

    print(f"\n{'=' * 80}")
    print(f"扫描完成!共处理 {len(items_to_rename)} 个项目")
    print(f"成功重命名: {renamed_count} 个")
    print(f"  - 文件: {len(renamed_files)} 个")
    print(f"  - 文件夹: {len(renamed_dirs)} 个")

    if renamed_files:
        print(f"\n重命名的文件:")
        for f in renamed_files[:10]:  # 只显示前10个
            print(f"  • {f}")
        if len(renamed_files) > 10:
            print(f"  ... 还有 {len(renamed_files) - 10} 个文件")


def preview_long_names_recursive(max_length=50):
    """
    递归预览当前文件夹及所有子文件夹中名称超过指定长度的文件和文件夹
    """
    current_dir = os.getcwd()
    long_items = []
    total_checked = 0

    print(f"当前目录: {current_dir}")
    print(f"检查阈值: 名称 > {max_length} 个字符")
    print("-" * 80)

    for root, dirs, files in os.walk(current_dir):
        # 检查文件夹
        for dir_name in dirs:
            total_checked += 1
            if len(dir_name) > max_length:
                long_items.append(('dir', root, dir_name))

        # 检查文件
        for file_name in files:
            total_checked += 1
            if len(file_name) > max_length:
                long_items.append(('file', root, file_name))

    print(f"总共检查了 {total_checked} 个项目")
    print("-" * 80)

    if not long_items:
        print("✅ 没有发现名称超过50个字符的文件或文件夹。")
        return

    # 分别统计文件和文件夹
    file_count = sum(1 for item in long_items if item[0] == 'file')
    dir_count = sum(1 for item in long_items if item[0] == 'dir')

    print(f"⚠️ 发现 {len(long_items)} 个名称超过50个字符的项目:")
    print(f"  - 文件: {file_count} 个")
    print(f"  - 文件夹: {dir_count} 个")
    print("-" * 80)

    for idx, (item_type, root, item) in enumerate(long_items, 1):
        name, ext = os.path.splitext(item)
        new_name = name[:30] + ext
        relative_path = os.path.relpath(root, current_dir)
        if relative_path == '.':
            relative_path = '当前目录'

        item_type_cn = "
回复

使用道具 举报

504

主题

8万

元宝

81万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
810154
 楼主| 发表于 前天 12:47 | 显示全部楼层
deep seek写的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|五花八门论坛 ( 豫ICP备15031300号-3 )

GMT+8, 2026-7-1 12:52 , Processed in 0.043633 second(s), 18 queries .

本站已稳定运营:

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表