62 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
| #!/bin/bash
 | |
| 
 | |
| # 文件名替换脚本:将文件名中的指定旧字符串替换为新字符串
 | |
| # 用法:./rename_script.sh /目标/目录/路径 "旧字符串" "新字符串"
 | |
| 
 | |
| # 检查参数数量
 | |
| if [ $# -ne 3 ]; then
 | |
|     echo "错误:参数数量不正确"
 | |
|     echo "用法: $0 /目录/路径 \"旧字符串\" \"新字符串\""
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| target_dir="$1"
 | |
| old_str="$2"
 | |
| new_str="$3"
 | |
| 
 | |
| # 检查目录是否存在
 | |
| if [ ! -d "$target_dir" ]; then
 | |
|     echo "错误:目录 '$target_dir' 不存在"
 | |
|     exit 1
 | |
| fi
 | |
| 
 | |
| # 设置安全选项
 | |
| set -euo pipefail
 | |
| IFS=$'\n'  # 正确处理文件名中的空格
 | |
| 
 | |
| echo "开始处理目录: $target_dir"
 | |
| echo "替换规则: '$old_str' -> '$new_str'"
 | |
| echo "----------------------------------------"
 | |
| 
 | |
| # 查找所有包含旧字符串的文件名
 | |
| counter=0
 | |
| while IFS= read -r -d $'\0' file; do
 | |
|     # 获取文件名和目录路径
 | |
|     dirpath=$(dirname "$file")
 | |
|     filename=$(basename "$file")
 | |
| 
 | |
|     # 检查是否需要替换
 | |
|     if [[ "$filename" == *"$old_str"* ]]; then
 | |
|         # 执行替换
 | |
|         new_name="${filename//$old_str/$new_str}"
 | |
|         new_path="$dirpath/$new_name"
 | |
| 
 | |
|         # 跳过名称未变化的文件
 | |
|         if [[ "$filename" == "$new_name" ]]; then
 | |
|             continue
 | |
|         fi
 | |
| 
 | |
|         # 避免覆盖已存在文件
 | |
|         if [ -e "$new_path" ]; then
 | |
|             echo "警告: 跳过 '$file' -> '$new_name' (目标文件已存在)"
 | |
|             continue
 | |
|         fi
 | |
| 
 | |
|         # 执行重命名
 | |
|         mv -v "$file" "$new_path"
 | |
|         ((counter++))
 | |
|     fi
 | |
| done < <(find "$target_dir" -type f -print0 2>/dev/null)
 | |
| 
 | |
| echo "----------------------------------------"
 | |
| echo "完成! 已重命名 $counter 个文件" |