84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
fix_commas_and_pad_multi.py
|
||
批量修复多个文件夹中含逗号的数字文件名并补齐到6位,例如:
|
||
"01,000.png" -> "001000.png"
|
||
支持扫描指定文件夹中所有以"25"开头的子文件夹
|
||
"""
|
||
|
||
import os
|
||
import argparse
|
||
|
||
VALID_EXTS = {'.png', '.exr'}
|
||
|
||
def safe_rename(src, dst, dry_run=False):
|
||
if os.path.exists(dst):
|
||
print(f"[跳过] 目标已存在,未重命名:{os.path.basename(src)} -> {os.path.basename(dst)}")
|
||
return False
|
||
print(f"[重命名] {os.path.basename(src)} -> {os.path.basename(dst)}")
|
||
if not dry_run:
|
||
os.rename(src, dst)
|
||
return True
|
||
|
||
def fix_folder(root_folder, dry_run=False):
|
||
changed = 0
|
||
for root, dirs, files in os.walk(root_folder):
|
||
for fname in files:
|
||
name, ext = os.path.splitext(fname)
|
||
if ext.lower() not in VALID_EXTS:
|
||
continue
|
||
|
||
# 若文件名中含逗号,则移除逗号
|
||
if ',' in name:
|
||
candidate = name.replace(',', '')
|
||
else:
|
||
candidate = None
|
||
|
||
if candidate is None or not candidate.isdigit():
|
||
continue
|
||
|
||
padded = candidate.zfill(6)
|
||
if padded == name:
|
||
continue
|
||
|
||
src_path = os.path.join(root, fname)
|
||
dst_path = os.path.join(root, padded + ext)
|
||
if safe_rename(src_path, dst_path, dry_run=dry_run):
|
||
changed += 1
|
||
|
||
print(f"[完成] {root_folder} 共重命名 {changed} 个文件。\n")
|
||
|
||
def find_25_folders(root_folder):
|
||
"""查找所有以'25'开头的子文件夹"""
|
||
folders = []
|
||
for item in os.listdir(root_folder):
|
||
item_path = os.path.join(root_folder, item)
|
||
if os.path.isdir(item_path) and item.startswith('25'):
|
||
folders.append(item_path)
|
||
return folders
|
||
|
||
def main():
|
||
p = argparse.ArgumentParser(
|
||
description="修复含逗号的数字文件名并补齐到6位,例如 01,000.png -> 001000.png(扫描指定文件夹中所有以25开头的子文件夹)"
|
||
)
|
||
p.add_argument("root_folder", help="包含多个以25开头的子文件夹的根目录")
|
||
p.add_argument("--dry-run", action="store_true", help="仅模拟显示将要做的重命名,不执行")
|
||
args = p.parse_args()
|
||
|
||
if not os.path.isdir(args.root_folder):
|
||
print(f"❌ 路径无效:{args.root_folder}")
|
||
return
|
||
|
||
target_folders = find_25_folders(args.root_folder)
|
||
if not target_folders:
|
||
print(f"❌ 在 {args.root_folder} 中未找到以'25'开头的子文件夹")
|
||
return
|
||
|
||
print(f"\n=== 在 {args.root_folder} 中找到 {len(target_folders)} 个以'25'开头的子文件夹 ===")
|
||
|
||
for folder in target_folders:
|
||
print(f"\n=== 处理文件夹:{folder} ===")
|
||
fix_folder(folder, dry_run=args.dry_run)
|
||
|
||
if __name__ == "__main__":
|
||
main() |