在Bash中批量移除多余文件扩展名
解决带空格文件名的.temp扩展名移除问题
你的脚本之所以在文件名含空格时失效,核心问题是没给basename的输出结果加双引号。当文件名有空格时,$(basename "$f" .temp)展开后会被Shell按空格拆分成多个参数,mv就会把后面的部分误判为目标目录,自然执行出错。
最简单的修复方式就是给basename的结果套上双引号,让Shell把整个文件名当作一个完整的参数处理:
for f in *; do mv "$f" "$(basename "$f" .temp)"; done
不过我更推荐一种更高效的写法——直接用Shell自带的参数扩展功能,不用调用外部的basename命令:
for f in *.temp; do mv "$f" "${f%.temp}"; done
这里的几个关键点:
*.temp:只遍历带.temp后缀的文件,避免处理不需要修改的文件,减少无用操作${f%.temp}:这是Shell的参数扩展语法,作用是从变量f的末尾移除最短的.temp匹配串,完美实现移除扩展名的需求,而且完全在Shell内部处理,不会有空格或特殊字符的问题
两种方法都能解决你的问题,第二种更符合Shell脚本的最佳实践,执行效率也更高~
内容的提问来源于stack exchange,提问作者wolf_math
相关产品推荐
相关产品推荐

