You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Shell脚本中递归替换.properties文件版本号并重命名?

递归重命名.properties文件替换版本号

没问题!我来帮你搞定这个递归重命名的需求,刚好可以结合find命令和文本替换工具来实现,给你两个靠谱的方案:

方案1:用Perl版rename(简洁高效)

如果你的系统安装了Perl版本的rename(大多数Linux发行版默认自带,比如Ubuntu、Debian),可以直接用一行命令搞定:

find /your/target/directory -type f -name "*.properties" -exec rename 's/_[0-9]+\.[0-9]+(\.[0-9]+)?\.properties$/_1.3.5.properties/' {} \;

命令拆解:

  • /your/target/directory:替换成你要递归搜索的根目录路径
  • -type f:只处理文件(排除目录)
  • -name "*.properties":精准匹配所有.properties结尾的文件
  • rename的正则表达式:s/_[0-9]+\.[0-9]+(\.[0-9]+)?\.properties$/_1.3.5.properties/
    • 匹配下划线_开头,后面跟着x.yx.y.z格式的版本号,最后是.properties
    • 把匹配到的部分替换成_1.3.5.properties

方案2:通用Bash脚本(兼容所有系统)

如果你的系统没有Perl版rename(比如部分RHEL/CentOS用的是简化版rename),可以用这个更通用的Bash循环脚本,兼容性拉满:

#!/bin/bash
TARGET_DIR="/your/target/directory"
NEW_VERSION="1.3.5"

find "$TARGET_DIR" -type f -name "*.properties" | while read -r file; do
    filename=$(basename "$file")
    dir_path=$(dirname "$file")
    # 用sed替换版本号
    new_filename=$(echo "$filename" | sed 's/_[0-9]\+\.[0-9]\+\(\.[0-9]\+\)\?\.properties$/_'"$NEW_VERSION"'.properties/')
    
    # 只在文件名变化时执行重命名,避免无效操作
    if [ "$filename" != "$new_filename" ]; then
        mv "$file" "$dir_path/$new_filename"
        echo "已重命名:$file -> $dir_path/$new_filename"
    fi
done

脚本说明:

  1. 先定义目标目录和新版本号,方便后续修改
  2. find递归查找所有.properties文件
  3. basenamedirname分离文件名和路径,避免路径中的特殊字符干扰替换
  4. sed的正则和方案1一致,确保只替换文件名末尾的版本号部分
  5. 增加了判断逻辑,不会重复重命名已经是目标版本的文件

重要注意事项

  • 先测试再执行:可以把脚本里的mv改成echo mv,先打印出将要执行的重命名操作,确认没有问题后再去掉echo执行实际修改
  • 处理特殊字符:脚本里所有变量都用双引号包裹,支持文件名或路径包含空格、特殊字符的情况
  • 正则调整:如果你的版本号有其他格式(比如带字母前缀),可以修改正则表达式,比如把_[0-9]+改成_[a-zA-Z0-9]+来匹配包含字母的版本号

内容的提问来源于stack exchange,提问作者Hemangi Patil

火山引擎 最新活动