终端中如何按原顺序将图像序列重命名为连续偶数编号?
问题:将序列帧重命名为连续偶数编号并保留原有顺序
现有按顺序命名为1.tif、2.tif、3.tif、4.tif…的动画帧图像序列,需要重命名为2.tif、4.tif、6.tif、8.tif…的连续偶数编号格式,且必须保留原有顺序。尝试执行以下命令时出现了原顺序丢失的问题:
num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num+=2)); done
需求背景是帧率过低,希望通过偶数编号预留奇数帧位置来补全序列,避免重新渲染全部内容。
问题原因
原命令中for i in *会按照系统默认的文件名排序规则遍历文件,这种排序是字符串排序而非数字排序。比如文件名包含两位数时,10.tif会排在2.tif前面,导致处理顺序混乱,最终丢失原序列的正确顺序。
解决方案
方法1:使用按数字排序的遍历方式
借助GNU ls的-v参数(按版本号/数字顺序排序),先把文件按正确顺序列出来再处理:
num=2; for i in $(ls -v *.tif); do mv "$i" "$(printf '%04d' $num).tif"; ((num+=2)); done
方法2:直接按数字序列遍历(更可靠)
如果确定所有帧都是连续的1.tif、2.tif…没有缺失,可以直接按数字生成旧文件名,避免依赖ls的排序:
# 先统计总帧数 frame_count=$(ls *.tif | wc -l) # 从1到总帧数遍历,逐个重命名 for ((i=1; i<=frame_count; i++)); do old_file="${i}.tif" new_number=$((i * 2)) new_file="$(printf '%04d' $new_number).tif" mv "$old_file" "$new_file" done
注意事项
ls -v是GNU工具链的特性,Linux系统默认支持;如果是macOS,需先安装GNU ls(比如通过brew安装coreutils后用gls -v)- 如果原文件名带有前导零(比如0001.tif),只需调整
printf的格式(比如%04d对应四位数字)和遍历的数字格式即可 - 执行重命名前建议先备份文件,或者把
mv换成echo mv来预览操作,避免误删或覆盖文件
内容的提问来源于stack exchange,提问作者eli099
相关产品推荐
相关产品推荐

