本文目录导读:

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
注意事项
- 冲突处理:如果转换后文件名重复,脚本可能覆盖已有文件,建议先在测试目录试验
- 备份建议:运行前最好备份数据
- 权限检查:确保有修改文件的权限
- 特殊字符:文件名可能包含特殊字符,脚本已做基本处理
选择最适合您的平台和需求的版本即可!