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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:20:41