脚本如何实现文件批量重命名功能

wen 实用脚本 1

本文目录导读:

脚本如何实现文件批量重命名功能

  1. Python脚本实现
  2. Shell脚本 (Linux/Mac)
  3. Windows批处理
  4. 使用Pathlib (Python 3.4+)
  5. 高级功能 - 正则表达式重命名
  6. 使用建议

Python脚本实现

基础版本 - 按序号重命名

import os
def batch_rename(path, prefix="file", start_num=1):
    files = os.listdir(path)
    for i, filename in enumerate(files, start=start_num):
        # 获取文件扩展名
        ext = os.path.splitext(filename)[1]
        # 新文件名
        new_name = f"{prefix}_{i}{ext}"
        # 完整路径
        old_path = os.path.join(path, filename)
        new_path = os.path.join(path, new_name)
        os.rename(old_path, new_path)
        print(f"重命名: {filename} -> {new_name}")
# 使用示例
batch_rename("./images", "photo", 1)

高级版本 - 支持多种模式

import os
import re
class FileRenamer:
    def __init__(self, path):
        self.path = path
    def add_prefix(self, prefix):
        """添加前缀"""
        for filename in os.listdir(self.path):
            new_name = f"{prefix}{filename}"
            os.rename(
                os.path.join(self.path, filename),
                os.path.join(self.path, new_name)
            )
    def replace_text(self, old_text, new_text):
        """替换文本"""
        for filename in os.listdir(self.path):
            if old_text in filename:
                new_name = filename.replace(old_text, new_text)
                os.rename(
                    os.path.join(self.path, filename),
                    os.path.join(self.path, new_name)
                )
    def add_date_prefix(self, date_str):
        """添加日期前缀"""
        for filename in os.listdir(self.path):
            new_name = f"{date_str}_{filename}"
            os.rename(
                os.path.join(self.path, filename),
                os.path.join(self.path, new_name)
            )
    def change_extension(self, new_ext):
        """修改扩展名"""
        for filename in os.listdir(self.path):
            name_without_ext = os.path.splitext(filename)[0]
            new_name = f"{name_without_ext}.{new_ext}"
            os.rename(
                os.path.join(self.path, filename),
                os.path.join(self.path, new_name)
            )
# 使用示例
renamer = FileRenamer("./files")
renamer.add_prefix("2024_")
renamer.replace_text("old", "new")

Shell脚本 (Linux/Mac)

批量添加前缀

#!/bin/bash
# 批量添加前缀
for file in *.jpg; do
    mv "$file" "photo_$file"
done

批量替换文件名中的文本

#!/bin/bash
# 替换文件名中的文本
for file in *; do
    new_name="${file//old_text/new_text}"
    mv "$file" "$new_name"
done

按序号重命名

#!/bin/bash
# 按序号重命名
count=1
for file in *; do
    ext="${file##*.}"
    mv "$file" "$(printf "file_%03d.%s" $count $ext)"
    ((count++))
done

Windows批处理

@echo off
setlocal enabledelayedexpansion
:: 批量重命名 - 添加前缀
set count=1
for %%f in (*.jpg) do (
    ren "%%f" "photo_%%f"
)
:: 批量重命名 - 按序号
set count=1
for %%f in (*.txt) do (
    ren "%%f" "file_!count!.txt"
    set /a count+=1
)

使用Pathlib (Python 3.4+)

from pathlib import Path
def smart_rename(path, pattern="*"):
    """智能重命名"""
    path = Path(path)
    for file in path.glob(pattern):
        if file.is_file():
            # 获取文件信息
            stem = file.stem  # 文件名(不含扩展名)
            suffix = file.suffix  # 扩展名
            # 示例:添加修改日期
            import datetime
            mod_time = file.stat().st_mtime
            date_str = datetime.datetime.fromtimestamp(mod_time).strftime("%Y%m%d")
            new_name = f"{date_str}_{stem}{suffix}"
            file.rename(path / new_name)

高级功能 - 正则表达式重命名

import os
import re
def regex_rename(path, pattern, replacement):
    """使用正则表达式重命名"""
    for filename in os.listdir(path):
        new_name = re.sub(pattern, replacement, filename)
        if new_name != filename:
            os.rename(
                os.path.join(path, filename),
                os.path.join(path, new_name)
            )
# 示例:将 "IMG_20240101_001.jpg" 转为 "photo_20240101_001.jpg"
regex_rename("./photos", r"^IMG_", "photo_")
# 示例:删除文件名中的数字
regex_rename("./docs", r"\d+", "")

使用建议

  1. 先测试:重要文件先备份或使用--dry-run参数
  2. 正则表达式:处理复杂命名规则时非常有用
  3. 异常处理:添加try-except避免错误中断
  4. 图形界面:使用Tkinter或PyQt创建GUI版本

需要我帮你写一个特定场景的重命名脚本吗?

抱歉,评论功能暂时关闭!