批量文件重命名脚本
批量重命名指定目录下的文件,支持添加前缀/后缀、序号、替换字符、修改扩展名,带预览模式。
详细内容
#!/usr/bin/env python3
# 批量文件重命名脚本
# 使用方法: python3 batch_rename.py <目录> [选项]
import os
import sys
import argparse
def batch_rename(directory, prefix='', suffix='', start_num=1,
replace_from='', replace_to='', extension=None, dry_run=True):
"""
批量重命名文件
:param directory: 目标目录
:param prefix: 文件名前缀
:param suffix: 文件名后缀(不含扩展名)
:param start_num: 序号起始值
:param replace_from: 要替换的字符串
:param replace_to: 替换为的字符串
:param extension: 统一修改扩展名(如 .txt)
:param dry_run: 预览模式,不实际重命名
"""
if not os.path.isdir(directory):
print(f"错误: 目录不存在 - {directory}")
return
files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
files.sort()
print(f"目录: {directory}")
print(f"文件数: {len(files)}")
print(f"模式: {'预览(不执行)' if dry_run else '执行'}")
print("-" * 60)
for i, filename in enumerate(files):
name, ext = os.path.splitext(filename)
# 替换字符
if replace_from:
name = name.replace(replace_from, replace_to)
# 添加前缀后缀和序号
new_name = f"{prefix}{name}{suffix}_{start_num + i:03d}"
# 修改扩展名
if extension:
ext = extension if extension.startswith('.') else f'.{extension}'
new_filename = f"{new_name}{ext}"
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_filename)
print(f" {filename} → {new_filename}")
if not dry_run and old_path != new_path:
os.rename(old_path, new_path)
print("-" * 60)
if dry_run:
print("以上为预览,添加 --execute 参数实际执行")
else:
print("重命名完成!")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='批量文件重命名工具')
parser.add_argument('directory', help='目标目录')
parser.add_argument('--prefix', default='', help='文件名前缀')
parser.add_argument('--suffix', default='', help='文件名后缀')
parser.add_argument('--start', type=int, default=1, help='序号起始值')
parser.add_argument('--replace-from', default='', help='要替换的字符串')
parser.add_argument('--replace-to', default='', help='替换为的字符串')
parser.add_argument('--ext', default=None, help='统一修改扩展名')
parser.add_argument('--execute', action='store_true', help='实际执行(默认预览)')
args = parser.parse_args()
batch_rename(
args.directory,
prefix=args.prefix,
suffix=args.suffix,
start_num=args.start,
replace_from=args.replace_from,
replace_to=args.replace_to,
extension=args.ext,
dry_run=not args.execute
)