怎么用脚本转换大小写文件名

wen 实用脚本 2

本文目录导读:

怎么用脚本转换大小写文件名

  1. Bash 脚本方案(Linux/macOS)
  2. Python 脚本方案(跨平台)
  3. PowerShell 脚本方案(Windows)
  4. 简单命令行版本(适用于快速操作)
  5. 使用示例
  6. 注意事项

Bash 脚本方案(Linux/macOS)

#!/bin/bash
# convert_case.sh
# 用法: ./convert_case.sh [路径] [选项]
# 选项: -u 转大写, -l 转小写, -t 转标题格式
usage() {
    echo "用法: $0 [-u|-l|-t] [路径]"
    echo "  -u  转换为大写"
    echo "  -l  转换为小写"
    echo "  -t  转换为标题格式(首字母大写)"
    exit 1
}
# 解析参数
CASE=""
PATH_DIR="${2:-.}"
case "$1" in
    -u) CASE="upper" ;;
    -l) CASE="lower" ;;
    -t) CASE="title" ;;
    *) usage ;;
esac
# 转换函数
convert_name() {
    local old_name="$1"
    local new_name=""
    case "$CASE" in
        upper)
            new_name=$(echo "$old_name" | tr '[:lower:]' '[:upper:]')
            ;;
        lower)
            new_name=$(echo "$old_name" | tr '[:upper:]' '[:lower:]')
            ;;
        title)
            new_name=$(echo "$old_name" | awk '{
                for (i=1; i<=NF; i++) {
                    $i = toupper(substr($i,1,1)) substr($i,2)
                }
                print $0
            }')
            ;;
    esac
    echo "$new_name"
}
# 遍历文件并重命名
find "$PATH_DIR" -depth -type f | while read -r file; do
    dir_name=$(dirname "$file")
    base_name=$(basename "$file")
    extension="${base_name##*.}"
    filename="${base_name%.*}"
    new_prefix=$(convert_name "$filename")
    # 检查是否有扩展名
    if [ "$extension" != "$base_name" ]; then
        new_name="${new_prefix}.${extension}"
    else
        new_name="$new_prefix"
    fi
    if [ "$base_name" != "$new_name" ]; then
        mv "$file" "${dir_name}/${new_name}"
        echo "重命名: ${file} → ${dir_name}/${new_name}"
    fi
done

Python 脚本方案(跨平台)

#!/usr/bin/env python3
# convert_case.py
import os
import sys
import argparse
def convert_filename(filename, case):
    """转换文件名大小写"""
    path, name = os.path.split(filename)
    if not os.path.exists(filename):
        raise FileNotFoundError(f"文件不存在: {filename}")
    # 分离文件名和扩展名
    base, ext = os.path.splitext(name)
    # 应用转换
    if case == 'upper':
        new_base = base.upper()
    elif case == 'lower':
        new_base = base.lower()
    elif case == 'title':
        new_base = base.title()
    else:
        new_base = base
    # 重新组合路径
    new_filename = os.path.join(path, new_base + ext)
    return new_filename
def process_directory(directory, case, recursive=True):
    """处理目录中的所有文件"""
    count = 0
    for root, dirs, files in os.walk(directory):
        for file in files:
            full_path = os.path.join(root, file)
            try:
                new_path = convert_filename(full_path, case)
                if new_path != full_path:
                    os.rename(full_path, new_path)
                    count += 1
                    print(f"重命名: {full_path}")
                    print(f"     → {new_path}")
            except Exception as e:
                print(f"错误: {file}: {e}", file=sys.stderr)
    print(f"\n总共处理了 {count} 个文件")
def main():
    parser = argparse.ArgumentParser(description='批量转换文件名大小写')
    parser.add_argument('case', choices=['upper', 'lower', 'title'],
                       help='转换类型: upper/lower/title')
    parser.add_argument('path', nargs='?', default='.',
                       help='要处理的目录(默认当前目录)')
    parser.add_argument('--no-recursive', action='store_true',
                       help='不递归处理子目录')
    args = parser.parse_args()
    # 检查路径是否存在
    if not os.path.exists(args.path):
        print(f"错误: 路径不存在: {args.path}", file=sys.stderr)
        sys.exit(1)
    process_directory(args.path, args.case, not args.no_recursive)
if __name__ == '__main__':
    main()

PowerShell 脚本方案(Windows)

# convert_case.ps1
param(
    [Parameter(Mandatory=$true)]
    [ValidateSet("upper", "lower", "title")]
    [string]$Case,
    [string]$Path = ".",
    [switch]$Recursive
)
function Convert-Case {
    param([string]$String, [string]$CaseType)
    switch ($CaseType) {
        "upper" { return $String.ToUpperInvariant() }
        "lower" { return $String.ToLowerInvariant() }
        "title" { 
            $culture = [System.Globalization.CultureInfo]::InvariantCulture
            return $culture.TextInfo.ToTitleCase($String)
        }
    }
}
function Process-File {
    param([string]$FilePath, [string]$CaseType)
    $directory = Split-Path $FilePath -Parent
    $fileName = Split-Path $FilePath -Leaf
    $baseName = [System.IO.Path]::GetFileNameWithoutExtension($fileName)
    $extension = [System.IO.Path]::GetExtension($fileName)
    $newBase = Convert-Case -String $baseName -CaseType $CaseType
    $newFileName = $newBase + $extension
    $newPath = Join-Path $directory $newFileName
    if ($fileName -ne $newFileName) {
        Rename-Item $FilePath -NewName $newFileName
        Write-Host "重命名: $FilePath -> $newPath" -ForegroundColor Green
    }
}
# 获取文件列表
if ($Recursive) {
    $files = Get-ChildItem -Path $Path -Recurse -File
} else {
    $files = Get-ChildItem -Path $Path -File
}
# 处理文件(从后往前处理,避免冲突)
$files | Sort-Object { $_.FullName } -Descending | ForEach-Object {
    Process-File -FilePath $_.FullName -CaseType $Case
}

简单命令行版本(适用于快速操作)

仅转换当前目录(Linux/macOS)

# 转大写
for f in *; do 
    mv "$f" "$(echo "$f" | tr '[:lower:]' '[:upper:]')" 2>/dev/null
done
# 转小写
for f in *; do 
    mv "$f" "$(echo "$f" | tr '[:upper:]' '[:lower:]')" 2>/dev/null
done

批量处理指定目录

# 处理指定目录中的所有文件
find /path/to/directory -type f | while read f; do
    dir=$(dirname "$f")
    base=$(basename "$f")
    # 转大写
    newname=$(echo "$base" | tr '[:lower:]' '[:upper:]')
    if [ "$base" != "$newname" ]; then
        mv "$f" "${dir}/${newname}"
    fi
done

使用示例

Bash 脚本

# 将当前目录所有文件转为小写
./convert_case.sh -l
# 将指定目录转为大写
./convert_case.sh -u /path/to/directory

Python 脚本

# 将当前目录所有文件转为大写
python3 convert_case.py upper
# 递归处理指定目录,转换文件名为小写
python3 convert_case.py lower /path/to/directory
# 不递归处理当前目录
python3 convert_case.py title --no-recursive

PowerShell

# 转换当前目录文件为小写
.\convert_case.ps1 -Case lower
# 递归处理指定目录
.\convert_case.ps1 -Case upper -Path D:\Documents -Recursive

注意事项

  1. 冲突处理:如果转换后文件名重复,脚本可能覆盖已有文件,建议先在测试目录试验
  2. 备份建议:运行前最好备份数据
  3. 权限检查:确保有修改文件的权限
  4. 特殊字符:文件名可能包含特殊字符,脚本已做基本处理

选择最适合您的平台和需求的版本即可!

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