Renombrar con cmd o .bat

Iniciado por danihomer, 24 Marzo 2017, 20:51 PM

0 Miembros y 1 Visitante están viendo este tema.

danihomer

Buenas a todos

Tengo unos archivos para renombrar, archivos que caen en carpetas y subcarpetas. Son de este estilo:

Libro_hoy_interior_01F.pdf
Libro_hoy_interior_01B.pdf
Libro_hoy_interior_02F.pdf
Libro_hoy_interior_02B.pdf

Revista_hoy_interior_01F.pdf
Revista_hoy_interior_01B.pdf

y asi sucesivamente, siempre tienen la variable de F.pdf y B.pdf
yo querria renombrar esa parte F.pdf por _Cara.pdf y B.pdf por _Dorso.pdf
Necesito busque y reemplace en subdirectorios, los archivos caen aleatoriamente en unos cuantos.
Una vez renombrados habría que moverlos a otras carpetas, eso lo tengo solucionado, pero antes necesito ese renombre.

ren C:\Users\Administrator1\Desktop\carpeta1\*B.pdf *_Dorso.pdf

Con ese comando basico, lo renombra pero elimina los numero, y necesito que lo respeten.

ren C:\Users\Administrator1\Desktop\carpeta1\*01F.pdf *01_Cara.pdf
ren C:\Users\Administrator1\Desktop\carpeta1\*02F.pdf *02_Cara.pdf

Si pongo eso, lo renombra bien, pero solo en esa carpeta, podria poner las secuencia de numeros hasta donde sea, no es problema, pero como podría buscar en subdirectorios con esos comandos

gracias
salu2



Serapis

Cita de: danihomer en 24 Marzo 2017, 20:51 PM

ren C:\Users\Administrator1\Desktop\carpeta1\*B.pdf *_Dorso.pdf

Con ese comando basico, lo renombra pero elimina los numero, y necesito que lo respeten.

ren C:\Users\Administrator1\Desktop\carpeta1\*01F.pdf *01_Cara.pdf
ren C:\Users\Administrator1\Desktop\carpeta1\*02F.pdf *02_Cara.pdf

Si pongo eso, lo renombra bien, pero solo en esa carpeta, podria poner las secuencia de numeros hasta donde sea, no es problema, pero como podría buscar en subdirectorios con esos comandos
Dado el nombre del fichero como ejemplo: Libro_hoy_interior_01F.pdf
Debes poner un comodín por cada letra que deba respetarse... NOTA: solo te irá bién si todos los ficheros tienen el mismo tamaño en cuanto a caracteres, y sería esto (para el ejemplo propuesto)
ren c:\micarpeta\*F.pdf ?????????????????????_Cara.pdf
el resultado será este: Libro_hoy_interior_01_Cara.pdf

Si cada fichero tiene su tamaño propio o bien en la carpeta hay diferentes tamaños de ficheros y /o diferentes nombres, entonces podrían ser mal renombrados, en tal caso ordenalos en diferentes carpetas, para poder tratar todos los que son similares de una sola vez. Si procedes desde con orden y lógica, podrías conseguirlo, si exiges que los últimos caracteres antes de la extensión la fijas, o bien si son diferentes desde el comienzo... por ejemplo:
Libro_hoy_interior_01F.pdf y Revista_hoy_interior_01F.pdf son diferentes, luego aunque estén en la misma carpeta, puedes crear un comando para cada caso

En vez de este:
*F.pdf ?????????????????????_Cara.pdf
paralos 'libro' usar este:
L*F.pdf ?????????????????????_Cara.pdf
y para los 'revista', usar éste otro:
R*F.pdf ???????????????????????_Cara.pdf
Nota que cada comodín '?' justifica solo a un carácter, luego deben ponerse tantos como se quiera que permanezcan en destino...

Y si la cosa es demasiado complicada, o bien te no aciertas a poner el comando adecuado, entonces es mejor que recurras a un programa específico que te ayude a renombrar de forma masiva (por ejemplo el viejo 'Magic file Renamer', tiene opciones para casi todo), la shell de win2, no tiene demasiadas opciones...

Eleкtro

#2
Cita de: danihomer en 24 Marzo 2017, 20:51 PMsiempre tienen la variable de F.pdf y B.pdf

Entonces es suficiente con hacer un substring para determinar el último caracter del nombre de archivo y así poder simplificar el procedimiento de renombrado de archivos.

El siguiente código que he escrito hace todo lo que pides:

Código (ini) [Seleccionar]
@Echo Off & SetLocal EnableDelayedExpansion

Set "frontWord=_Cara"
Set "backWord=_Dorso"

For /R %%# In ("*_0?F.pdf", "*_0?B.pdf") Do (
   Set "srcFilename=%%~n#"
   Set "lastChar=!srcFilename:~-1!"
   If /I "!lastChar!" EQU "F" (Set "dstFilename=!srcFilename:~0,-1!%frontWord%")
   If /I "!lastChar!" EQU "B" (Set "dstFilename=!srcFilename:~0,-1!%backWord%")
   Echo Renaming "%%~nx#" to "!dstFilename!%%~x#"...
   Rename "%%~f#" "!dstFilename!%%~x#"
)

Pause & Exit /B 0


¡Saludos!








danihomer

Que bueno lo hace, incluso en subcarpetas, solo una cosa que no entiendo.

A veces este tipo de nombres los numeros pasan de 09 a 10, 11, 12 etc

Libro_hoy_interior_10F.pdf
Libro_hoy_interior_10B.pdf
Libro_hoy_interior_11F.pdf
Libro_hoy_interior_11B.pdf

Revista_hoy_interior_19F.pdf
Revista_hoy_interior_19B.pdf

En estos casos no lo esta renombrando, es como si no hubiera archivos, hasta el 09 sin problema.
Tendrá solución??

Gracias
salu2

Eleкtro

Cita de: danihomer en 25 Marzo 2017, 11:20 AMA veces este tipo de nombres los numeros pasan de 09 a 10, 11, 12 etc

En estos casos no lo esta renombrando, es como si no hubiera archivos, hasta el 09 sin problema.
Tendrá solución??

Sencillamente adapta la expresión/patrón de búsqueda a tus necesidades...

Código (dos) [Seleccionar]
For /R %%# In ("*_??F.pdf", "*_??B.pdf") Do (...)

O bien:
Código (dos) [Seleccionar]
For /R %%# In ("*_0?F.pdf", "*_0?B.pdf", "*_1?F.pdf", "*_1?B.pdf") Do (...)
...siendo este último el que ofrece mayor nivel de certeza/seguridad.

Saludos.








danihomer

Gracias de verdad

Esos ultimos codigos no hacian nada, pero en el primero puse 2 ?? y solucionado, porque lo que seguro q nunca hay son 3 numeros

gracias
salu2

Eleкtro

#6
Cita de: danihomer en 25 Marzo 2017, 12:46 PMEsos ultimos codigos no hacian nada, pero en el primero puse 2 ?? y solucionado, porque lo que seguro q nunca hay son 3 numeros

Tomando este nombre de archivo como ejemplo: "Libro_hoy_interior_10F.pdf", el patrón de búsqueda "*_1?F.pdf" te debería funcionar.

Lo que hace el símbolo del interrogante (?) es capturar cero o un caracteres, es decir, que si has usado dos interrogantes de la siguiente manera como me das a enteder "*_??F.pdf" entonces te podrá dar falsos positivos por ejemplo si tuvieras archivos con estos nombres: "Libro_hoy_interior_F.pdf" o "Libro_hoy_interior_XF.pdf" o "Libro_hoy_interior_XXF.pdf", pero mientras seas consciente de eso y lo tengas controlado entonces no habrá problema.
Si quieres perfeccionar el algoritmo de búsqueda entonces habría que recurrir al comando externo FINDSTR.exe utilizando una expresión regular, pero esto no te lo recomiendo por que... bueno, esto es Batch; inicializar el proceso FINDSTR.exe por cada achivo en la iteración resultaría en un impacto muy negativo de velocidad; si se busca la eficiencia entonces es mejor recurrir a cualquier otro lenguaje de programación.  

Me alegro de que lo hayas solucionado.

¡Saludos!








danihomer

El patron será fijo, me refiero, siempre habrá numeros y letras, sean 01B o 25F, sin numeros no haría lo que tiene que hacer después.
El cambiar la F y la B es para automatizar otros procesos despues.

Gracias de verdad
salu2