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

时间:2015-09-08 09:39:14

标签: linux bash shell file-rename

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

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

但似乎没有用。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

您的问题是即使文件已存在,mv -n也会返回零。

我很想这样做:

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循环尝试重命名),可以消除文件夹冲突的可能性。