Нерекурсивное решение.
Я не знаю cmd.exe
, поэтому я не могу исправить ваш скрипт, но если у вас установлен Python, вы можете использовать этот скрипт (который должен работать на всех ОС):
import os
files = os.listdir('.')
for f in files:
newname = f.upper()
if newname == f:
continue
if newname in files:
print( "error: %s already exists" % newname )
os.rename(f, newname)
Просто сохраните его как upcase_files_folders.py
и затем запустите python upcase_files_folders.py
в каталоге, файлы которого вы хотите переименовать.
Обновление: рекурсивное решение.
Извините, я только что понял, что вы хотели рекурсивное решение.
Следующий скрипт будет обходить дерево подкаталогов, записывая файлы и подкаталоги, которые будут переименованы в стеке. Затем он извлекает файлы / подкаталоги из стека один за другим и помещает их в регистр.
(Лучше всего двухэтапное решение, чтобы избежать переименования каталогов в середине обхода. Попытка сделать все сразу будет подвержена ошибкам и хрупка.)
Также, вероятно, лучше вести журнал изменений на случай, если вы запустите скрипт по ошибке. Этот скрипт будет записывать все переименования в .upcase_files_folders.log
.
from __future__ import print_function
import os
with open('.upcase_files_folders.log','a') as logfile:
renames = []
for d, subdirs, fs in os.walk(os.getcwd()):
for x in fs + subdirs:
oldname = os.path.join(d, x)
newname = os.path.join(d, x.upper())
if x == '.upcase_files_folders.log' or newname == oldname:
continue
for (oldname, newname) in reversed(renames):
os.rename(oldname, newname)
print( "renamed: %s --> %s" % (repr(oldname), repr(newname)), file = logfile )