如何重命名顺序文件,使它们从零开始?

时间:2012-01-28 23:00:58

标签: bash rename

非优雅,非灵活的方式是这样的:

for path in *.jpg # IMG_1067_CR2.jpg, MG_1068_CR2.jpg, etc.
do
    mv "$path" "${index-0}.jpg"
    let index+=1
done
unset index

更好的方法应该支持前导零(例如ffmpeg),避免使用虚拟变量污染环境,使用干运行选项(如rename),并且不需要指定延期两次。这是否受现有工具的支持?

或者,如何使this solution与前导零一起使用:

rename -n 's/IMG_([0-9]*)\.jpg/$1/; $_="IMG_".($_-1067).".jpg"' *.jpg 

3 个答案:

答案 0 :(得分:1)

这会将IMG_1067_CR2.jpg, IMG_1068_CR2.jpg...变为IMG_0_CR2.jpg, IMG_1_CR2.jpg ...。如果您对结果感到满意,请删除echo

#!/bin/bash
i=0
for img in *.jpg; do
  echo mv "$img" "${img/_[[:digit:]]*_/_$((i++))_}"
done
unset i

如果您希望将更改递归到多个级别的子目录。通过执行以下操作,您可以使用 Bash 4.x 轻松完成此操作:

  1. 在for循环之前添加以下行:shopt -s globstar
  2. for img in *.jpg; do更改为for img in **/*.jpg; do

答案 1 :(得分:1)

要处理前导零,您可以使用printf

...
NEW=$(printf "%04d.jpg" $index)
mv "$path" "$NEW"
...

答案 2 :(得分:1)

你可以这样做:

rename -n 's/IMG_([0-9]*)\.jpg/$1/; $_="IMG_".substr("000" . ($_-1067), -4).".jpg"' *.jpg

将“0”表示为“0000”,将“907”表示为“0907”。