4

我正在使用以下代码重命名当前文件夹中的所有图像:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" ${a}); #04 pad to length of 4
  mv ${i} ${new};
  a=$((a+1));
done

但是我遇到了一个问题:有些图像被覆盖了,因为我在文件夹中添加了更多图像后才使用它。有没有办法来解决这个问题?我想添加一个if (name_exists) then next_name,但我是脚本新手。请问有什么帮助吗?

4

2 回答 2

2

您可以使用:

#!/bin/bash
glob="[0-9][0-9][0-9][0-9].jpg"
last=$(find . -maxdepth 1 -name "$glob" -print |sort -gr |grep -Pom1 '\d{4}') # or  |grep -om1 '[0-9][0-9]*')
last=${last:-0}
while IFS= read -d $'\0' -r image
do
    let last++
    echo mv "$image" "$(printf "%04s" $last ).jpg"
done < <(find . -maxdepth 1 -name \*.jpg -a -not -name "$glob" -print0)

在哪里:

  • 1stfind找到最后使用的号码
  • while read读取输出
  • 第二个find找到所有.jpg具有不同名称的 NNNN.jpg
  • 递增和重命名

你可以改进这个

  • 搜索其他类型的图像(不仅是 jpg)
  • 将脚本更改为不区分大小写
  • 如果图像计数超过以上将失败9999...所以...

脚本处于echo模式,满意时删除

编辑

破折号版本:

glob="[0-9][0-9][0-9][0-9].jpg"
last=$(find . -maxdepth 1 -name "$glob" -print |sort -gr |grep -Pom1 '\d{4}') # or  |grep -om1 '[0-9][0-9]*')
last=${last:-0}
for image in *.jpg
do
    echo "$image" | grep -q "^$glob$" && continue
    #last=$((last+1))  #with leading zeroes, the numbers treated as octal... fails for 08 and such
    last=$(expr $last + 1)
    echo mv "$image" "$(printf "%04d" $last ).jpg"
done
于 2014-10-13T12:38:57.433 回答
0

将以下内容添加到您的脚本中

a=1
for i in *.jpg; do
    new=$(printf "%04d.jpg" ${a});
    while [ -f ${new} ]
    do
       a=$((a+1));
       new=$(printf "%04d.jpg" ${a});
    done
    mv ${i} ${new};
    a=$((a+1));
done

如果您对编号名称不太讲究。你可以使用这个:

if [ -f ${new} ]
then
    new=$(printf "%04d_%s.jpg" ${a} $(date +'%H_%M_%S'))
fi

而不是一段时间。

于 2014-10-13T12:33:22.907 回答