You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:03:37