如何用Perl的rename命令给文件名补前导零且保留扩展名?
解决rename命令补前导零同时保留文件扩展名的问题
你的问题出在原命令的替换逻辑——它把数字.txt整个匹配项替换成了仅格式化后的数字,自然会丢失扩展名。要同时实现补前导零和保留扩展名,需要调整正则匹配和替换的Perl表达式,让扩展名被包含在替换结果里。
正确命令
rename -n 's/(\d+)(\.txt)/sprintf("%03d%s", $1, $2)/e' ./*.txt
说明
- 正则部分
(\d+)(\.txt):把文件名拆成两部分捕获组——$1是数字部分,$2是.txt扩展名 - 替换部分用
sprintf("%03d%s", $1, $2):通过Perl的sprintf函数,先把$1格式化为3位带前导零的数字,再拼接上$2的扩展名 e修饰符:让替换字符串作为Perl代码执行,这样才能解析sprintf的逻辑-n参数是测试模式,只会输出重命名预览,确认结果符合预期后,去掉-n即可执行实际重命名
你之前尝试的命令问题分析
- 第一个命令
rename -n 's/(\d+)(\.txt)/sprintf "%03d", $1/e$2' ./*.txt:e是正则替换的修饰符,必须放在替换语句的末尾(分隔符之后),e$2的写法语法错误,Perl无法识别 - 第二个命令
rename -n 's/(\d+)(\.txt)/(sprintf "%03d", $1/e)$2' ./*.txt:括号和e的位置错误,e作为修饰符不能放在替换代码内部,这种写法会导致Perl解析失败
内容的提问来源于stack exchange,提问作者user26614668
相关产品推荐
相关产品推荐

