赵乾舟 发表于 5 天前

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

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 == 'file')
    dir_count = sum(1 for item in long_items if item == '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 = "

赵乾舟 发表于 5 天前

deep seek写的
页: [1]
查看完整版本: 遍历当前目录,文件夹和文件名超过50个字符,自动修改到30