实用脚本能批量重命名吗?

wen 实用脚本 7

本文目录导读:

实用脚本能批量重命名吗?

  1. Python脚本(最灵活)
  2. 批量添加编号
  3. 正则表达式替换
  4. 提取日期信息重命名
  5. 批量转换文件扩展名
  6. 使用命令行工具(Windows)
  7. Linux/macOS bash脚本
  8. 使用建议

是的,有很多实用脚本可以批量重命名文件,以下是几种常见且实用的方法:

Python脚本(最灵活)

import os
def batch_rename(path, prefix="", suffix="", replace_old="", replace_new=""):
    for filename in os.listdir(path):
        old_path = os.path.join(path, filename)
        if os.path.isfile(old_path):
            new_name = filename
            if prefix:
                new_name = prefix + new_name
            if suffix:
                name, ext = os.path.splitext(new_name)
                new_name = name + suffix + ext
            if replace_old:
                new_name = new_name.replace(replace_old, replace_new)
            new_path = os.path.join(path, new_name)
            os.rename(old_path, new_path)
            print(f"重命名: {filename} -> {new_name}")
# 使用示例
batch_rename("./images", prefix="2024_", suffix="_v2", replace_old="old", replace_new="new")

批量添加编号

import os
def add_numbers(path, start=1, digit=3, position="prefix"):
    """
    position: "prefix" 或 "suffix"
    """
    files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
    files.sort()
    for i, filename in enumerate(files, start):
        name, ext = os.path.splitext(filename)
        num = str(i).zfill(digit)
        if position == "prefix":
            new_name = f"{num}_{filename}"
        else:
            new_name = f"{name}_{num}{ext}"
        os.rename(
            os.path.join(path, filename),
            os.path.join(path, new_name)
        )
        print(f"{filename} -> {new_name}")
add_numbers("./photos", start=1, digit=4, position="prefix")

正则表达式替换

import os
import re
def regex_rename(path, pattern, replacement):
    for filename in os.listdir(path):
        old_path = os.path.join(path, filename)
        if os.path.isfile(old_path):
            new_name = re.sub(pattern, replacement, filename)
            if new_name != filename:
                new_path = os.path.join(path, new_name)
                os.rename(old_path, new_path)
                print(f"{filename} -> {new_name}")
# 示例:去掉文件名中的空格和特殊字符
regex_rename("./files", r'[\s\(\)\[\]]', '_')

提取日期信息重命名

import os
from datetime import datetime
def rename_by_date(path):
    for filename in os.listdir(path):
        old_path = os.path.join(path, filename)
        if os.path.isfile(old_path):
            # 获取文件修改时间
            timestamp = os.path.getmtime(old_path)
            date_str = datetime.fromtimestamp(timestamp).strftime("%Y%m%d")
            name, ext = os.path.splitext(filename)
            new_name = f"{date_str}_{name}{ext}"
            os.rename(old_path, os.path.join(path, new_name))
            print(f"{filename} -> {new_name}")
rename_by_date("./documents")

批量转换文件扩展名

import os
import glob
def change_extension(path, old_ext, new_ext):
    for file_path in glob.glob(os.path.join(path, f"*.{old_ext}")):
        name, _ = os.path.splitext(file_path)
        new_file = f"{name}.{new_ext}"
        os.rename(file_path, new_file)
        print(f"{os.path.basename(file_path)} -> {os.path.basename(new_file)}")
change_extension("./data", "txt", "csv")

使用命令行工具(Windows)

PowerShell脚本:

# 批量添加前缀
Get-ChildItem "C:\path\to\files" -File | ForEach-Object { 
    Rename-Item $_ -NewName ("prefix_" + $_.Name)
}
# 批量替换文件名中的文字
Get-ChildItem "C:\path\to\files" -File | 
    Where-Object { $_.Name -match "oldtext" } | 
    ForEach-Object { 
        $newName = $_.Name -replace "oldtext", "newtext"
        Rename-Item $_ -NewName $newName
    }

Linux/macOS bash脚本

#!/bin/bash
# 批量添加序号
i=1
for file in *.jpg; do
    mv "$file" "$(printf "%03d_$file" $i)"
    ((i++))
done
# 批量替换
for file in *.txt; do
    mv "$file" "${file//old/new}"
done

使用建议

  1. 先测试:在子集上测试脚本
  2. 备份:重要文件先备份
  3. 打印日志:记录重命名前后的对比
  4. 使用try/except:处理异常情况

这些脚本可以灵活组合使用,满足各种批量重命名需求,如果需要更复杂的重命名逻辑,可以进一步定制。

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