Попробуйте сделать это так
#!/usr/bin/python
import os
# Collect the names and type (file or directory)
filenames = os.listdir(".")
filetypes = map(lambda x: os.path.isdir(x), filenames)
files = zip(filenames, filetypes)
files = sorted(files, key=lambda x: (x[0].lower(), x[1]))
# Create a set of downcased filenames for quick lookup
files_lower = set()
for f in files:
files_lower.add(f[0].lower())
previous_name = ""
# Rename the files
for f in files:
if f[0].lower() == previous_name.lower() and f[1] is True:
# Find an unused index
c = 0
while True:
f_rename = f[0].lower() + "_" + str(c)
if f_rename.lower() in files_lower:
c += 1
else:
print("renaming %s to %s" % (f[0], f_rename))
os.rename(f[0], f_rename)
files_lower.add(f_rename.lower())
break
previous_name = f[0]
Предположим, у меня есть следующие записи в каталоге
$ ls -F
a A/ b/ B/ B_0/ bb/ bB/ Bb/ BB/ c/ d/ D/
Другими словами, это все каталоги, кроме "a", который является обычным файлом. Запуск этого скрипта даст следующий вывод
renaming A to a_0
renaming b to b_1
renaming Bb to bb_0
renaming bB to bb_1
renaming bb to bb_2
renaming d to d_0
и каталог теперь содержит следующие записи
$ ls -F
a a_0/ B/ B_0/ b_1/ BB/ bb_0/ bb_1/ bb_2/ c/ D/ d_0/
Сценарий переименовывает только каталоги (вы упомянули, что вы переименовываете только каталоги) и преобразует имена всего, что переименовывает, во все строчные буквы (на основе вашего примера). Также осторожно, чтобы не переименовывать каталог в имя, которое уже существует (следовательно, b -> b_1 в моем примере, так как B_0 уже существует).
Надеюсь, что это работает для вас.