¿Hay alguna manera de cambiar el nombre de los archivos por lotes a minúsculas?

63

Necesito una forma de cambiar el nombre de todos los archivos en carpetas y subcarpetas a minúsculas.

Me gustaría saber si hay una manera de hacerlo usando solo Windows (XP o 7)

ino
fuente
Windows no diferencia entre mayúsculas y minúsculas como lo hace Unix. quizás, si dijiste, por qué necesitas esto, ayudaría a resolver el problema.
Rook
1
@Idigas. Lo sentimos, pero desde NTFS, los nombres de archivo han sido sensibles a mayúsculas y minúsculas. Consulte support.microsoft.com/kb/100625
DaveParillo el
Simplemente genial. Tome una mala idea y difúndala más. Qué pesadilla de soporte cuando alguien envía un archivo y un error de dedo gordo significa que envió "Answers.dat" y el proceso entrante espera "answers.dat". Simplemente no hay una buena razón para que esos dos nombres se consideren 'diferentes'.
David el
2
@David, por ejemplo, Java realmente requiere nombres de archivo sensibles a mayúsculas y minúsculas. Eso puede generar muchos problemas en los sistemas de archivos que no distinguen entre mayúsculas y minúsculas.
Arjan el
10
Sé que esto es viejo, pero quería aclarar un error aquí. Si bien NTFS admite mayúsculas y minúsculas, el sistema operativo Windows NO se diferencia.
geo

Respuestas:

122

Vaya al directorio y ejecute el siguiente comando:

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

Aquí está el desglose en caso de que alguien quiera modificar / mejorar:

  • for /f - Por cada línea
  • "Tokens=*" - Procesar cada elemento en cada línea.
  • %f in (...)- %fes su nombre de variable para cada artículo.
  • dir - enumera cada archivo y subdirectorio en un directorio.
  • /l- (parámetro para dir) Utiliza minúsculas.
  • /b- (parámetro para dir) Utiliza formato simple, solo los nombres de archivo / directorio, sin tamaño, sin encabezados.
  • /a-d- (parámetro para dir) No , no la lista de directorios . ( asignifica attribute, -representa noty drepresenta directory) .
  • rename "%f" "%f"- cambie el nombre del archivo con su propio nombre, que en realidad está en minúscula por el dircomando y la /lcombinación.
serpiente de loft
fuente
77
Versión recursiva: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(agregada / r al directorio).
Sawny
3
esto es simplemente brillante
Shir Gans
44
La versión recursiva no funcionó para mí; rename se quejó de que el comando tenía un formato no válido. Resulta que / s causó que el segundo archivo aparezca como una ruta absoluta y el uso de la expansión del nombre de archivo (% ~ nxf) me dio el nombre de archivo original en mayúscula. Terminé simplemente recurriendo manualmente.
Dogmatixed
3
Esta es una muy buena respuesta; hasta el punto, no se necesitan programas externos, comando agradable y pequeño, no se necesita complicación de archivos por lotes.
Jeff Wilbert
2
¿Se puede modificar para cambiar minúsculas a mayúsculas?
Chucky
18

spacetornado Renamer es un programa de Windows que renombra cantidades masivas de archivos en lotes. Puede buscar y reemplazar texto, eliminar un cierto número de caracteres, cambiar el caso a minúscula, mayúscula o primera letra mayúscula y agregar texto al principio o al final (agregar / anteponer) de cada nombre de archivo

ingrese la descripción de la imagen aquí

joe
fuente
1
Por favor, dame el motivo del voto negativo
Joe
55
La gente rara vez explica, desafortunadamente: /
Gnoupi el
77
Supongo que el voto negativo se debió a que el OP quería una solución que funcionara sin ningún software adicional. Y supongo que el voto negativo no se explicó porque algunas personas son propensas a repartir votos negativos de venganza.
INNAM
La interfaz gráfica de usuario es un poco original, pero hace el trabajo mejor que varios otros renombradores que he visto por ahí.
jcollum
1
Hizo lo que hizo, cuando necesitaba un cambio de nombre recursivo para limpiar archivos de un servidor FTP de Linux ... sin embargo, necesitaba ejecutarlo como administrador antes de que funcionara correctamente. Se siente como un viejo programa sin mantenimiento :)
Nelson
12

Desde Windows 7 puede usar PowerShell para esas tareas

Get-ChildItem "C:\path\to\folder" -recurse | 
  Where {-Not $_.PSIsContainer} | 
  Rename-Item -NewName {$_.FullName.ToLower()}

- Elija su carpeta raíz
- todos los archivos dentro de la carpeta raíz y las subcarpetas se renombran
- los nombres de las carpetas se excluyen con Where {-Not $_.PSIsContainer} |

nixda
fuente
7

Aquí hay una solución de línea de comandos recursiva adecuada que usa solo comandos cmd.exe nativos que realmente funcionan. Creo que es la solución nativa más simple posible:

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

Si está dispuesto a ir más allá de los comandos nativos de cmd.exe, entonces otra opción es mi utilidad de cambio de nombre de expresiones regulares JREN.BAT que admite opciones para convertir nombres en mayúsculas o minúsculas. Es un script puro (JScript / lote híbrido) que se ejecuta de forma nativa en cualquier máquina Windows desde XP en adelante, no se necesitan archivos exe de terceros. La documentación completa está integrada: se accede desde la línea de comandos a través de jren /?, o jren /??si desea una salida paginada.

Con JREN, la solución recursiva es tan simple como:

jren "^" "" /s /l
dbenham
fuente
1
Funciona genial. Para su información, elimine el /a-dinterruptor y también minúsculas los nombres de las carpetas también.
Keith
Intenté guardarlo como un archivo por lotes y lo introduje en system32 para poder ejecutarlo en cualquier momento con un solo comando. Resultados en esto: " D"') was unexpected at this time.ejecutarlo como un comando directo funciona bien, simplemente no funciona cuando se ejecuta como un archivo por lotes. No estoy seguro de cómo hacer que funcione como un archivo por lotes, pero pensé que me daría cuenta del problema.
Don Cullen el
1
@DonCullen: es una sintaxis estándar que los porcentajes variables FOR deben duplicarse cuando se usa FOR dentro de un script por lotes. Por %Dlo tanto, debe cambiar a %%D, y %Fa %%Fsi coloca el comando dentro de un script por lotes.
dbenham
Siempre aprendiendo algo nuevo todos los días. ¡Gracias!
Don Cullen
6

Mi utilidad favorita personal para renombrar archivos por lotes es WildRename de Cylog . Entre muchas otras características, puede cambiar el caso de los nombres de archivo. ¡Lo mejor de WildRename es probablemente que admite expresiones regulares!

Synetech
fuente
Esta es la aplicación correcta, después de la instalación en 10 segundos. Configuré y renombré recursivamente una carpeta remota (asignada por conveniencia).
Matteo Conta
5

Versión "recursiva" de la respuesta aceptada (que funciona *)

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"') do (for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g"))


El primer bucle

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')

Obtiene una lista de las rutas absolutas de todos los directorios dentro del actual (incluido):

C: \ Foo>

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


El segundo bucle

for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")

Obtiene una lista de todos los nombres de archivo (o nombres de archivo y directorio si retira el /a-dinterruptor) dentro de cada una de las rutas absolutas encontradas por el primer bucle , y convierte el nombre de estos archivos en minúsculas.

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


* necesita dos bucles porque el segundo argumento renamedebe ser un nombre de archivo y no una ruta absoluta (como la obtenida por el /sconmutador).

wc.matteo
fuente
¿Por qué tienes cmd /c "echo %cd%& en el primero for? Es completamente innecesario.
DavidPostill
@DavidPostill echo %cd%está ahí para agregar la carpeta actual a la lista de rutas absolutas ; y cmd /chace el &trabajo para combinar comandos. Soy un novato total con respecto a Windows Batch Scripting ; Si conoce una mejor manera, ¡no dude en mejorar la respuesta!
wc.matteo
Excelente trabajo para un novato. La suya fue la primera solución de línea de comandos cmd.exe nativa que realmente funciona, excepto que falla cuando un nombre comienza con espacio o punto y coma. La respuesta aceptada tiene el mismo problema. Vea mi respuesta para obtener una respuesta más simple que también funcione con espacio inicial o punto y coma.
dbenham
¿Se puede modificar esto para convertir más bajo a mayúsculas?
Rishav
3

Podrías usar una estrategia de "reemplazo de personaje" ...

set Name=%Name:A=a%
set Name=%Name:B=b%
set Name=%Name:C=c%

... y así sucesivamente, para las letras AZ. Probablemente podría implementarlo en forma de bucle FOR.

DednDave
fuente
1

http://www.dostips.com/DtCodeCmdLib.php#Function.toLower ofrece una función simple que debería poder incluir y llamar desde un archivo por lotes.

Por lo tanto, haga que el archivo por lotes repita las carpetas / nombres de archivo y llame a esta función para generar la versión en minúsculas del nombre.

Kevin Haines
fuente
1

Desde http://windowsitpro.com/articles/index.cfm?articleid=81612 :

Usando solo comandos estándar, he escrito LwrCase.bat y LwrCase_Folder.bat, para renombrar un nombre de archivo en minúsculas, o renombrar todos los nombres de archivo en una carpeta en minúsculas.

Para cambiar el nombre de un archivo a minúsculas, use:

[call] LwrCase FullyQualifiedFileName

Donde FullyQualifiedFileName es el nombre de archivo completo que se va a renombrar.

Para cambiar el nombre de todos los nombres de archivos en un directorio, use:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

donde FullyQualifiedDirectoryName es la ruta completa de la carpeta y / S es un parámetro opcional que también cambiará el nombre de los archivos en todas las subcarpetas.

NOTA: LwrCase.bat utiliza el modificador / L del comando DIR, que devuelve nombres en minúsculas.

LwrCase.bat contiene:

@echo off
if {%1}=={} @echo Syntax: LwrCase FullyQualifiedFileName&goto :EOF
if not exist %1 @echo LwrCase - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set file=%%a
)
if /i "%file:~0,1%" EQU "d" @echo LwrCase - %1 is NOT a file.&endlocal&goto :EOF
for /f "Tokens=*" %%f in ('dir %1 /L /b /a /a-d') do (
 Rename %1 "%%f"
)
endlocal

LwrCase_Folder.bat contiene:

@echo off
if {%1}=={} @echo Syntax: LwrCase_Folder FullyQualifiedDirectoryName&goto :EOF
if not exist %1 @echo LwrCase_Folder - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set folder=%%a
)
if /i "%folder:~0,1%" NEQ "d" @echo LwrCase_Folder - %1 is NOT a folder.&endlocal&goto :EOF
pushd %1
set sw=/B /A /A-D
if /i {%2}=={/S} set sw=%sw% %2
for /f "Tokens=*" %%f in ('dir %sw%') do (
 call LwrCase "%%f"
)
popd
endlocal
Incluso Mien
fuente
1

El mejor programa para hacer esto en Windows es Bulk Rename Utility . Es una herramienta de hombre. Incluso puede usar expresiones regulares para cambiar el nombre de archivos y / o carpetas. También tiene integración de shell (por lo que puede ejecutar desde el explorador con un clic derecho) que es muy agradable. Versiones de 64 bits y 32 bits disponibles.

ubiquibacon
fuente
1

La respuesta aceptada a esta pregunta, por loftysnake , funciona para el directorio actual pero no busca subcarpetas.  Sawny sugirió una modificación simple a la respuesta de loftysnake para que sea recursiva, pero no funciona, porque, si bien el renamecomando le permite especificar una unidad y ruta con el nombre de archivo1 (el origen), el nombre de archivo2 (el destino) debe ser solo un nombre de archivo . Para citar el /?mensaje de ayuda ( ),

... no puede especificar una nueva unidad o ruta para su archivo de destino.

Pero movefunciona donde renameno funciona, por lo que puede cambiar el nombre de los archivos de forma recursiva a minúsculas con este comando:

for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")

porque resulta que Movepuede hacer frente a las rutas de directorio.

El comando anterior funciona cuando se escribe directamente en el símbolo del sistema ( CMD.EXE). Si desea hacer esto desde un .BATarchivo por lotes ( ), debe duplicar los %caracteres:

for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")

Y probablemente puedas dejar los paréntesis y el /y y decir simplemente do move ….

Adrian
fuente
Si va a volver a publicar información que otros ya han publicado, debe identificar a los autores originales y vincularlos a sus publicaciones.
Scott
Lo siento, pero estaba señalando que movefuncionó donde renameno funciona, y creo que soy el único que ha sugerido el uso del movecomando aquí. Simplemente tomé las sugerencias de @loftysnake y @sawny, y espero haberlas mejorado un poquito.
Adrian
Eso es raro; Pensé que alguien más lo había mencionado move, pero no puedo encontrarlo ahora.
Scott,
0

Solución recursiva. Ponga esto en un archivo recursiverename.cmd.

for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
for /r /d %%x in (*) do (
    pushd "%%x"
    for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
    popd
)
Mick
fuente