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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:46