¿Cómo poner en mayúsculas todos los archivos y carpetas de un directorio?

¿Cómo poner en mayúsculas todos los archivos y carpetas de un directorio?

¿Cómo se cambia el nombre de todas las carpetas y archivos de una carpeta a MAYÚSCULAS? (si es posible en sus subcarpetas también)

Tengo este código, pero solo convierte archivos, no carpetas.

@echo off
setlocal enableDelayedExpansion

pushd %currentfolder%

for %%f in (*) do (
   set "filename=%%~f"

   for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
      set "filename=!filename:%%A=%%A!"
   )
   ren "%%f" "!filename!" >nul 2>&1
)
endlocal

Respuesta1

Solución no recursiva.

No lo sé cmd.exe, así que no puedo arreglar tu script, pero si tienes Python instalado, puedes usar este script (que debería funcionar en todos los sistemas operativos):

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)

Simplemente guárdelo como upcase_files_folders.pyy luego ejecútelo python upcase_files_folders.pyen el directorio cuyos archivos desea cambiar de nombre.


Actualización: solución recursiva.

Lo siento, me acabo de dar cuenta de que querías una solución recursiva.

El siguiente script recorrerá el árbol de subdirectorios y registrará los archivos y subdirectorios cuyo nombre se cambiará en una pila. Luego extrae los archivos/subdirectorios de la pila uno por uno y los pone en mayúsculas.

(Lo mejor es una solución de dos etapas para evitar cambiar el nombre de los directorios en medio del recorrido. Intentar hacerlo todo a la vez será propenso a errores y frágil).

Además, probablemente sea mejor mantener un registro de los cambios en caso de que ejecute el script por error. Este script registrará todos los cambios de nombre en formato .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 )

información relacionada