如何在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
相关产品推荐
相关产品推荐

