Linux Bash中如何将文件名(不含扩展名)替换为目录名?
批量重命名Output开头文件为目录名+原扩展名
你的脚本存在两个关键问题:
- 循环定义的变量是
f,但后续引用的是未定义的file,导致变量为空 - 重命名时未保留原文件的扩展名,且所有文件会被改成同一个名字,会造成文件覆盖
以下是两种可行的解决脚本:
方法一:直接截取扩展名部分
nombre=${PWD##*/} for f in Output*; do # 去掉文件名开头的"Output",保留扩展名(含点) ext="${f#Output}" mv -- "$f" "${nombre}${ext}" done
比如Output.txt会被改成当前目录名.txt,Output.csv改成当前目录名.csv,无扩展名的Output会直接改成目录名。
方法二:提取后缀名(更通用)
nombre=${PWD##*/} for f in Output*; do # 提取文件的后缀名(不含点) ext="${f##*.}" # 判断文件是否有后缀名 if [ "$ext" = "$f" ]; then # 无后缀名,直接重命名为目录名 mv -- "$f" "$nombre" else # 有后缀名,拼接目录名+点+后缀名 mv -- "$f" "${nombre}.${ext}" fi done
注意事项
- 执行前可以把
mv换成echo mv,先预览重命名操作,确认无误再执行实际的mv --用于避免文件名以-开头时被mv识别为命令选项
内容的提问来源于stack exchange,提问作者Gerald Vasquez Aleman
相关产品推荐
相关产品推荐

