基于Bin/Bash脚本批量精准替换文件夹及子项名称的技术咨询
解决方案
1. 先把Excel表格转成CSV格式
把你的Excel文件另存为逗号分隔的CSV文件(比如name_mapping.csv),注意:
- 删除表头行,只保留旧名称、新名称的对应数据行
- 如果公司名称包含逗号或空格,确保CSV里用双引号把名称括起来(Excel导出时会自动处理)
2. 编写Bash脚本实现批量重命名
创建脚本文件batch_rename.sh,内容如下:
#!/bin/bash # 检查CSV文件是否存在 if [ ! -f "$1" ]; then echo "错误:指定的CSV文件不存在!" exit 1 fi # 逐行读取CSV文件,处理每一对新旧名称 while IFS=, read -r old_name new_name; do # 去除名称两端可能的双引号(如果CSV里有) old_name=$(echo "$old_name" | sed 's/^"//;s/"$//') new_name=$(echo "$new_name" | sed 's/^"//;s/"$//') # 目标1:重命名精准匹配的公司文件夹 if [ -d "$old_name" ]; then echo "正在重命名文件夹:$old_name -> $new_name" mv "$old_name" "$new_name" else echo "警告:文件夹 $old_name 不存在,跳过" continue fi # 目标2:处理新文件夹内的内容,以下二选一(注释掉不需要的选项) # --- 选项A:仅重命名完全匹配旧名称的文件/子文件夹 --- echo "正在处理 $new_name 内的精准匹配项..." find "$new_name" -depth -name "$old_name" -exec sh -c ' for path do dir=$(dirname "$path") new_path="$dir/$(basename "$path" | sed "s/^$old_name$/$new_name/")" mv "$path" "$new_path" done ' sh {} + # --- 选项B:替换文件名中所有出现旧名称的部分 --- # echo "正在处理 $new_name 内的名称替换..." # find "$new_name" -depth -exec sh -c ' # for path do # dir=$(dirname "$path") # new_name_part=$(basename "$path" | sed "s/$old_name/$new_name/g") # new_path="$dir/$new_name_part" # if [ "$path" != "$new_path" ]; then # mv "$path" "$new_path" # fi # done # ' sh {} + done < "$1" echo "批量重命名完成!"
3. 脚本使用说明
- 给脚本添加执行权限:
chmod +x batch_rename.sh - 运行脚本,传入你的CSV文件路径:
./batch_rename.sh name_mapping.csv
关键细节说明
- 精准匹配保障:脚本仅对完全等于旧名称的文件夹执行重命名,避免误改相似名称的目录
- 特殊字符兼容:通过去除CSV双引号、变量加双引号的方式,支持名称含空格、特殊符号的场景
- 路径有效性维护:用
find -depth确保先处理子层级文件/文件夹,再处理上层,避免重命名过程中路径失效
内容的提问来源于stack exchange,提问作者Trevor McDaniel
相关产品推荐
相关产品推荐

