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

标签 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

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

最佳答案

您的问题是即使文件已经存在,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 循环尝试重命名它),您消除了文件名冲突的可能性。

关于linux - 如何重命名所有文件而不覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32454298/

相关文章:

c - 服务创建socket失败怎么办?

Java运行时异常: Unable to create lock manager

linux - 使用 mailx 和 bash 脚本解析邮件正文

bash - WICD-CLI 脚本 : How i read variable from the list of wireless networks

java - Tomcat 托管的 Web 应用程序链接在 Linux 中不起作用

使用系统(命令)时,C++ 代码在 AWS 中失败,错误为 "cannot allocate memory"

bash - bash文件中可以映射哪些常见的HDFS命令?

mysql - 将数据从csv导入到mysql的脚本

shell - Grails应用程序中的bash命令

linux - Bash:如何在包含多个条件的 while 循环中读取文件?