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

KSH环境下如何移除多扩展名文件名的最后一个扩展名?

解决文件名后缀移除问题:保留中间.txt,只删最后.org

嘿,我懂你遇到的麻烦了——用cut按.分割的话,会把前面的.txt也一起切掉,完全不是你想要的结果对吧?别担心,下面给你几个在Unix/Linux环境下好用的解决方案,专门针对这种「只移除最后一个后缀」的需求:

1. Bash 内置参数扩展(最推荐,无需额外工具)

Bash本身就自带强大的字符串处理能力,用%操作符就能轻松搞定。这个操作符的作用是从字符串末尾开始,移除匹配到的最短模式。

比如你定义文件名变量后,直接用下面的命令重命名:

file="dir1/dir2/filename.txt.org"
mv "$file" "${file%.*}"

这里${file%.*}会精准去掉最后一个.及其后面的所有内容,最终得到dir1/dir2/filename.txt,完美符合你的要求。

2. rename命令(批量处理首选)

如果你需要一次性处理多个类似的文件,rename工具会非常高效。不过要注意不同系统的rename语法略有差异:

Debian/Ubuntu 等基于Perl的rename

rename 's/\.org$//' dir1/dir2/*.txt.org

这个正则表达式\.org$专门匹配文件名末尾的.org,然后把它替换成空字符串,批量完成重命名。

RedHat/CentOS 等util-linux版本的rename

rename .org '' dir1/dir2/*.txt.org

直接指定要替换的后缀.org为空,简单粗暴又有效。

3. sed配合mv(适合复杂文本处理场景)

如果你的需求后续可能更复杂,比如需要匹配特定模式的文件名,sed可以帮你灵活生成新文件名:

file="dir1/dir2/filename.txt.org"
new_file=$(echo "$file" | sed 's/\.org$//')
mv "$file" "$new_file"

这里的sed命令同样是定位到文件名末尾的.org并删除,得到目标文件名后再执行重命名。

为什么cut不适合这个场景?

你之前用cut遇到问题,是因为cut -d '.' -f 1会把整个字符串按.分割,只取第一部分,也就是dir1/dir2/filename,自然会丢掉中间的.txt。而我们需要的是保留前面所有内容,只去掉最后一个后缀,所以上面的方法才是正确的打开方式。

内容的提问来源于stack exchange,提问作者sid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:02:39