¿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)


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.

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í


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} |


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

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!


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).


¿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.



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

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.


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 ….


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
)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.