Linux下如何用单条命令批量递增重命名文件?
解决Linux下批量递增重命名文件的问题
这问题踩过坑的人都懂——绝对不能从编号小的文件开始往大的重命名!比如先把name_file_00000.jpg改成name_file_00001.jpg,那原来的name_file_00001.jpg直接就被覆盖了,数据找不回来的!
正确的思路是从最大的编号开始倒着处理,这样每个文件重命名的时候,目标文件名还没被修改过,完全不会有冲突。下面给你两种可靠的实现方式:
方法一:通用Bash循环(所有Linux系统都支持)
直接在终端里执行这段命令就行,逻辑清晰还容易理解:
for i in {80..0}; do old_filename=$(printf "name_file_%05d.jpg" "$i") new_filename=$(printf "name_file_%05d.jpg" "$((i + 1))") mv "$old_filename" "$new_filename" done
命令解释:
{80..0}:生成从80到0的倒序数字列表,确保先处理编号最大的文件printf "%05d":把数字格式化成5位带前导零的字符串,完美匹配你原文件名的格式$((i + 1)):计算新的编号(原编号+1)- 用双引号包裹文件名:避免万一文件名出现空格(虽然你的文件名没有,但这是好习惯)
方法二:用Perl版rename命令(更简洁)
如果你的系统装了Perl版本的rename(大部分主流发行版默认都有),可以用更简洁的命令,不过记得先加-n参数测试一下修改效果,确认没问题再去掉-n执行:
# 先测试修改效果,不会实际改名 ls -r name_file_*.jpg | rename -n 's/(\d{5})/sprintf("%05d", $1 + 1)/e' # 确认没问题后,执行实际改名 ls -r name_file_*.jpg | rename 's/(\d{5})/sprintf("%05d", $1 + 1)/e'
命令解释:
ls -r:倒序列出文件,保证先处理最大编号的文件,避免覆盖s/(\d{5})/.../e:正则匹配文件名里的5位数字,用Perl的sprintf计算加1后的5位数字,e表示替换部分是可执行的表达式-n:测试模式,只输出要修改的文件名,不实际执行操作,非常安全
两种方法都能完美实现你的需求,推荐第一种Bash循环,因为不需要依赖额外工具,所有Linux环境都能直接用。
内容的提问来源于stack exchange,提问作者Rodolfo Mói
相关产品推荐
相关产品推荐

