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

如何在Bash 3.2中给文件名扩展名前添加指定后缀

解决方案:在Bash 3.2中给文件名扩展名前添加指定后缀

你之前尝试用cut直接拼接后缀的方式行不通,因为cut会把+backup当成要读取的文件名参数,所以报错。下面提供两种适用于Bash 3.2的可行方案:

方法一:利用Bash参数扩展(推荐)

Bash 3.2支持参数扩展,可以直接分离文件名的主体和扩展名,无需额外调用外部命令,效率更高。假设你把用户指定的后缀存在变量$SUFFIX中,结合循环处理changedfile.txt中的每个文件名:

SUFFIX="_backup"
# 逐行读取文件,保留文件名中的空格和特殊字符
while IFS= read -r filename; do
  # 判断文件是否有扩展名
  if [[ "$filename" == *.* ]]; then
    # 提取不含扩展名的主体部分
    name_part="${filename%.*}"
    # 提取扩展名
    ext_part="${filename##*.}"
    # 拼接新文件名
    new_name="${name_part}${SUFFIX}.${ext_part}"
  else
    # 无扩展名的文件,直接在末尾加后缀
    new_name="${filename}${SUFFIX}"
  fi
  # 执行重命名,-- 避免文件名以-开头导致的问题
  mv -- "$filename" "$new_name"
done < changedfile.txt

参数扩展说明:

  • ${filename%.*}:从文件名末尾删除最短的.*匹配,得到文件主体(如a/b/c.toml得到a/b/c)
  • ${filename##*.}:从文件名开头删除最长的*.匹配,得到扩展名(如a/b/c.toml得到toml)

方法二:用sed命令拼接文件名

如果你习惯用文本处理工具,可以用sed替换生成新文件名,再结合循环执行重命名:

SUFFIX="_backup"
while IFS= read -r filename; do
  # 用sed替换带扩展名的文件名
  new_name=$(echo "$filename" | sed "s/\(.*\)\.\(.*\)/\1${SUFFIX}\.\2/")
  # 如果替换前后文件名相同,说明没有扩展名,直接加后缀
  if [[ "$new_name" == "$filename" ]]; then
    new_name="${filename}${SUFFIX}"
  fi
  mv -- "$filename" "$new_name"
done < changedfile.txt

sed替换规则说明:

  • \(.*\)\.\(.*\):匹配带扩展名的文件名,将主体部分存入分组\1,扩展名存入分组\2
  • \1${SUFFIX}\.\2:将分组内容和后缀拼接成新文件名

内容的提问来源于stack exchange,提问作者G.MAHESH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:24