如何在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.y或x.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
脚本说明:
- 先定义目标目录和新版本号,方便后续修改
find递归查找所有.properties文件basename和dirname分离文件名和路径,避免路径中的特殊字符干扰替换sed的正则和方案1一致,确保只替换文件名末尾的版本号部分- 增加了判断逻辑,不会重复重命名已经是目标版本的文件
重要注意事项
- 先测试再执行:可以把脚本里的
mv改成echo mv,先打印出将要执行的重命名操作,确认没有问题后再去掉echo执行实际修改 - 处理特殊字符:脚本里所有变量都用双引号包裹,支持文件名或路径包含空格、特殊字符的情况
- 正则调整:如果你的版本号有其他格式(比如带字母前缀),可以修改正则表达式,比如把
_[0-9]+改成_[a-zA-Z0-9]+来匹配包含字母的版本号
内容的提问来源于stack exchange,提问作者Hemangi Patil




