我使用以下代码重命名当前文件夹中的所有图片:
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
,但我是脚本新手。有什么帮助吗?
答案 0 :(得分: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)
其中:
find
找到上次使用的号码while read
读取find
什么找到所有.jpg
有不同名称的NNNN.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
答案 1 :(得分: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
而不是while。