bash迭代批量重命名文件仅生成单个文件的问题求解
错误原因
- 核心问题是正序遍历导致源文件被提前覆盖:你当前的for循环会按文件名从小到大匹配,优先处理
backup-001.bak,第一次执行mv就会把它重命名为backup-002.bak,直接覆盖原本存在的backup-002.bak源文件。 - 后续循环原本要处理的
backup-002.bak到backup-007.bak都已经被前一步的重命名操作覆盖,所有文件层层叠加覆盖后,最终只会剩下最后生成的backup-008.bak。 - 附加问题:你使用的通配符
backup-00[0-7].bak会匹配backup-000.bak,如果目录下存在该文件会被误处理,和你实际要操作的backup-001.bak到backup-007.bak的范围不符。
修复方案
只需要改成倒序遍历,从编号最大的文件开始重命名,就不会出现覆盖问题:
# 从7倒序迭代到1,先改大编号文件,避免覆盖待处理的小编号源文件 for num in {7..1}; do oldname="backup-00${num}.bak" newname="backup-00$((num + 1)).bak" mv -- "$oldname" "$newname" done
内容的提问来源于stack exchange,提问作者thewooster
相关产品推荐
相关产品推荐

