我想重命名文件夹中的所有文件,使其具有连续的编号。例如:
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 *.png
。counter
变量将跟踪增量。
这是一次试运行,删除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)