单行移除字符串末尾n字符及终端批量修改文件名方案
嘿,刚好你懂bash和Python,那我就从这两个方向给你讲清楚怎么解决这个批量重命名问题,还有你关心的「终端里移除字符串末尾n个字符」的通用方法~
针对你的批量重命名需求(.jpg.png → .png)
方法1:用bash的rename命令(最简洁)
如果你用的是Debian/Ubuntu这类系统(自带Perl版本的rename),直接一行命令就能搞定:
rename 's/\.jpg\.png$/.png/' *.jpg.png
解释:正则表达式\.jpg\.png$精准匹配文件名末尾的.jpg.png,替换成.png,高效又省心。
方法2:bash循环+字符串截取(满足你想了解的末尾截取需求)
如果你的系统没有Perl版rename,或者想手动实现字符串截取逻辑,可以用bash循环:
for file in *.jpg.png; do # ${file:0:-8} 表示取文件名从开头到倒数第8个字符(去掉最后8个字符) mv "$file" "${file:0:-8}.png" done
这里的.jpg.png正好是8个字符,所以用:-8去掉最后8位,再拼接.png就得到了目标文件名。
通用:终端(bash)中移除字符串末尾n个字符的方法
bash本身支持字符串切片操作,核心语法有两种:
- 固定n值:
${字符串变量:0:-n}
举个例子:my_str="hello_bash_123" echo "${my_str:0:-4}" # 输出 "hello_bash",去掉了最后4个字符"_123" - n是变量的情况(兼容旧版bash):
${字符串变量:0:${#字符串变量}-n}
先通过${#字符串变量}获取字符串总长度,再减去n得到截取的长度:
要是你用的是bash 4.0及以上版本,还可以简化成n=5 my_str="test_example" echo "${my_str:0:${#my_str}-$n}" # 输出 "test_ex",去掉最后5个字符"ample"${字符串变量::-n},和Python的[:-n]语法几乎一致~
Python实现方式(你熟悉的思路)
既然你懂Python,写个小脚本也很方便,完全用你提到的[:-8]思路:
import os # 遍历当前目录下的所有文件 for filename in os.listdir("."): # 筛选出以.jpg.png结尾的文件 if filename.endswith(".jpg.png"): # 去掉最后8个字符,拼接新后缀.png new_filename = filename[:-8] + ".png" os.rename(filename, new_filename)
通用移除末尾n个字符的话,Python的str[:-n]就直接能用,和你想的一样简单。
内容的提问来源于stack exchange,提问作者actinidia
相关产品推荐
相关产品推荐

