将文件夹中的所有文件重命名为连续的数字

将文件夹中的所有文件重命名为连续的数字

我想重命名文件夹中的所有文件,使其具有连续的编号。例如:

1.png
2.png
3.png
etc

我知道有重命名命令,我知道有许多这里有类似的问题,但我找不到方法。

笔记:建议的重复内容不包含针对我的情况的解决方案。请不要将其标记为重复,因为建议的重复内容没有回答我的问题

答案1

假设您想要在对文件进行排序时遵循 shell 通配符顺序,您可以执行以下操作:

#!/bin/bash
counter=0
for file in *; do 
    [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++))
done

这里循环遍历当前目录中的所有文件并按顺序依次重命名,如果您只想处理文件.png,请使用for file in *.pngcounter变量将跟踪增量。

这是一次试运行,删除echo后即可执行实际的重命名操作。

例子:

$ counter=0; for file in *; do [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++)); done
mv -i file.txt 1.png
mv -i foo.sh 2.png
mv -i bar.txt 3.png

答案2

这是一个可以完成你要求的 Python 脚本

基本用法:

python rename_files.py Pictures/

它将stdout在重命名每个文件之前打印输出

此版本会一直推送索引,直到发现具有该索引的文件名未被使用。尽管在脚本的连续迭代中文件名可能从不同的索引开始,但文件本身保持不变。

import os
import sys

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()

duplicates = []
last_index = None
for index,item in enumerate(files):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )
    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

替代版本,通过在每个文件名后附加时间戳,然后枚举它们来解决重复文件名的问题。随着文件数量的增加,此解决方案可能需要更长的时间,但对于数百个目录,这不会花费很长时间

import os
import sys
import time

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()
timestamp = str(int(time.time()))
for item in files:
    os.rename( os.path.join(top_dir,item) ,
               os.path.join(top_dir, timestamp + item) )

files2 = os.listdir( top_dir )

for index,item in enumerate(files2):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files2.pop(index)

for index,item in enumerate( files2  ):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )

    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

相关内容