如何重命名所有文件而不覆盖?

How to rename all the files and no overwriting?

我知道如何用数字重命名文件夹中的所有文件:

i=1
for f in *.jpg
do
    NEW_NAME=$( printf "%05d.jpg" $i )
#   echo mv "$f" "$( printf "%05d.jpg" $i )"
    mv -n "$f" "$NEW_NAME"
    ((i++))
done

所以我所有的文件都会被重命名,但是如果我有一个像 0004.jpg 这样的文件,它不会将文件重命名为 n+1。如果名称存在,我试图添加一个循环来增加 i

i=1
for f in *.jpg
do
    NEW_NAME=$( printf "%05d.jpg" $i )
#   echo mv "$f" "$( printf "%05d.jpg" $i )"
    mv -n "$f" "$NEW_NAME"
    MV=$?
    while [ $MV -ne 0 ]
    do
        ((i++))
        NEW_NAME=$( printf "%05d.jpg" $i )
        mv -n "$f" "$NEW_NAME"
        MV=$?       
    done
    ((i++))
done

不过好像不行。有什么帮助吗?

你的问题是 mv -n returns 即使文件已经存在也是零。

我很想这样做:

i=1
mkdir .newnames
for f in *.jpg
do
    NEW_NAME=$( printf "%05d.jpg" $i )
#   echo mv "$f" "$( printf "%05d.jpg" $i )"
    mv "$f" ".newnames/$NEW_NAME"
    ((i++))
done
mv .newnames/* .
rmdir .newnames

基本上,通过将文件移动到临时目录(前导 .(点)防止 for 循环尝试重命名它),您消除了文件名冲突的可能性。