我有一个目录,其中的图像文件遵循命名方案,并不总是连续的。 E.I:
IMG_33.jpg
IMG_34.jpg
IMG_35.jpg
IMG_223.jpg
IMG_224.jpg
IMG_225.jpg
IMG_226.jpg
IMG_446.jpg
我想重命名它们,所以它们就像这样,按照相同的顺序:
0001.jpg
0002.jpg
0003.jpg
0004.jpg
0005.jpg
0006.jpg
0007.jpg
0008.jpg
到目前为止,这是我提出的,虽然它是四位数的填充,但它并没有按文件名中的数字值排序。
#!/bin/bash
X=1;
for i in *; do
mv $i $(printf %04d.%s ${X%.*} ${i##*.})
let X="$X+1"
done
结果:
IMG_1009.JPG 0009.JPG
IMG_1010.JPG 0010.JPG
IMG_101.JPG 0011.JPG
IMG_102.JPG 0012.JPG
答案 0 :(得分:4)
<强>更新强>:
试试这个。如果输出正常,请删除echo
。
X=1; find . -maxdepth 1 -type f -name "*.jpg" -print0 | sort -z -n -t _ -k2 | while read -d $'\0' -r line; do echo mv "$line" "$(printf "%04d%s" $X .jpg)"; ((X++)); done
答案 1 :(得分:1)
使用超级有用的rename
。首先,填充一位数到两位数的文件;然后填充两位数到三位数的文件;等
rename IMG_ IMG_0 IMG_?.jpg
rename IMG_ IMG_0 IMG_??.jpg
rename IMG_ IMG_0 IMG_???.jpg
然后,你重新命名的for循环(或其他类似的东西)就可以了,因为文件按字母和数字顺序排列。
答案 2 :(得分:0)
怎么样:
while read f1;do
echo $f1
mv IMG_$f1 $f1
done< <(ls | cut -d '_' -f 2 | sort -n)
感谢 迈克尔