Shell脚本中替换文件名的点和短横线为下划线的问题
批量替换文件名中的
.和-为_的Shell脚本方案 我正在写一个Shell脚本,需要把文件名里的.和-全部替换成_。
文件名示例
当前文件名:
V123_45_678_910.11_1213-1415.sh
期望得到的文件名:
V123_45_678_910_11_1213_1415.sh
我尝试的命令
试过用mv命令处理,但只能替换特定字符串,达不到批量替换的效果,当前用的命令是:
for file in /virtualun/rest/scripts/IOL_Extra/*.sh ; do mv $file ${file//V15_IOL_NVMe_01./V15_IOL_NVMe_01_} ; done
正确的批量处理方案
下面是两种可行的批量替换方法,能一次性处理所有目标字符:
方法一:保留后缀的稳妥替换
先拆分文件名和后缀,只替换文件名部分的.和-,避免误改后缀:
for file in /virtualun/rest/scripts/IOL_Extra/*.sh; do # 分离文件名与后缀 base=$(basename "$file") ext="${base##*.}" name="${base%.*}" # 替换name中的.和-为_ new_name="${name//./_}" new_name="${new_name//-/_}" # 拼接完整路径的新文件名 new_file="${file%/*}/${new_name}.${ext}" # 执行重命名(可先换成echo mv测试效果) mv -- "$file" "$new_file" done
方法二:全局替换后恢复后缀
如果你的文件名只有末尾一个.用于区分后缀,可以先全局替换所有.和-,再把最后一个_改回.恢复后缀:
for file in /virtualun/rest/scripts/IOL_Extra/*.sh; do # 全局替换.和-为_ temp="${file//./_}" new_file="${temp//-/_}" # 把末尾的_sh改回.sh new_file="${new_file%_sh}.sh" # 执行重命名 mv -- "$file" "$new_file" done
重要提示
- 用
--标记参数结束,防止文件名以-开头时被当成命令参数解析 - 所有变量用双引号包裹,避免文件名含空格、特殊字符时出错
- 测试阶段可以把
mv改成echo mv,先打印出要执行的重命名命令,确认无误后再实际执行
内容的提问来源于stack exchange,提问作者Luke Hartt
相关产品推荐
相关产品推荐

