求助:使用Bash脚本结合sed批量修改XML文件名与内容
批量修改XML文件名及内容的Bash脚本修正
需求说明
要处理500多个文件夹下的XML文件,完成两项操作:
- 将路径
/var/opt/FTPserver/users/MainUsers/[原名称]/VFS/[原名称].xml重命名为/var/opt/FTPserver/users/MainUsers/[原名称]/VFS/[新名称].xml - 修改XML文件内的
<url>file://home/FTPserver/Customer/[原名称]/</url>行,把[原名称]替换为[新名称] - 使用
sed而非xmlstarlet,通过customerlogin.csv(A列原名称,B列新名称)批量处理
原脚本的问题
原脚本无效果是因为存在多个语法和逻辑错误:
- 变量拼写错误:
$org应为$orig - sed单引号无法解析变量:单引号内的
$orig和$new不会被替换为实际值 - find的文件名匹配错误:要找的是
$orig.xml而非$orig - sed替换语法错误:引号不匹配,替换规则格式错误
- 路径引用不严谨:变量拼接时未正确包裹,可能出现空格或特殊字符问题
修正后的脚本
#!/bin/bash # 确保CSV文件每行正确读取,跳过空行 while IFS=, read -r orig new || [[ -n "$orig" ]]; do # 跳过空行 [[ -z "$orig" || -z "$new" ]] && continue # 构造原文件路径和新文件路径 old_file="/var/opt/FTPserver/users/MainUsers/$orig/VFS/$orig.xml" new_file="/var/opt/FTPserver/users/MainUsers/$orig/VFS/$new.xml" # 重命名文件(-n避免覆盖已存在文件) if [[ -f "$old_file" ]]; then mv -n -- "$old_file" "$new_file" # 修改文件内的URL内容 sed -i "s#file://home/FTPserver/Customer/$orig/#file://home/FTPserver/Customer/$new/#" "$new_file" else echo "警告:文件不存在 - $old_file" fi done < customerlogin.csv
关键修正点说明
- 路径直接构造:不需要用
find,因为目录结构固定,直接拼接路径更高效可靠 - 变量正确引用:所有变量都用双引号包裹,避免空格或特殊字符导致的错误
- sed使用双引号:双引号内的变量会被正确解析,替换规则明确匹配URL中的原名称部分
- 存在性检查:先判断原文件是否存在,避免执行无效操作
- 处理空行:跳过CSV中的空行,防止错误执行
内容的提问来源于stack exchange,提问作者Trevor McDaniel
相关产品推荐
相关产品推荐

