非优雅,非灵活的方式是这样的:
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
答案 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 轻松完成此操作:
shopt -s globstar
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”。