Bat para renombrar contenido solo de sub carpetas

Necesito una gran ayuda.
En mi máquina tengo muchos archivos desordenados y quisiera saber si algo como lo que planteo a continuación es posible de implementar.
Necesitaría un bat que renombre largas cantidades de archivos con las siguientes extensiones: .MP4 .MKV y .AVI que tienen nombres variables.
Se encuentran dentro de carpetas y sub carpetas en una estructura como la que muestro en el árbol ANTES (es solo ejemplo).
Las carpetas y sub carpetas también tienen nombres variables, sin correlaciones.
Lo que pretendo es que al renombrarlos se les pueda adjudicar el nombre de la carpeta de nivel A, nunca el de las carpetas de nivel B que los contienen. Deberían quedar tal como se muestra en el ejemplo DESPUÉS.

¿Es factible implementar esto?

Nota: tanto la unidad como el nombre de la carpeta principal pueden variar.

Ejemplo de estructura antes

PRINCIPAL
├───A1
│        └───B1
│                   └───b1.mkv
├───A2
│        c2.mkv

├───A3
│        └───B3
│                   └───b3.avi
├───A4
│        d4.mp4

EJEMPLO DE ESTRUCTURA DESPUÉS

PRINCIPAL
├───A1
│        └───B1
│                   └───A1.mkv
├───A2
│         A2.mkv

├───A3
│        └───B3
│                   └───A3.avi
├───A4
│         A4.mp4

2 Respuestas

Respuesta
1

Muchas gracias, Adri. Por mi propia inexperiencia no fui capaz de encontrar algo que se adaptara a mi actual necesidad. De todos modos di con un par de cosas que me vienen bien para intentar solucionar otro problema que tengo con archivos y subcarpetas. Reitero mi agradecimiento por el trabajo que te has tomado y la rapidez en responder.

I. Hola Compañero, muchísimas gracias, me alegro de que haya logrado ver algo de información válida, y también que el experto Gggirald le haya arrojado información de primera mano.

Respuesta
2

Veo un problema en tu planteamiento: Si renombras, por ejemplo, al archivo <unidad>:\A1\B1\b1.mkv como <unidad>:\A1\B1\A1.mkv y hay más archivos MKV en la subcarpeta \A1\B1 habría que darle el mismo nombre que al anterior. Si hay garantías de que eso no puede ocurrir desaparecería el problema, pero intuyo que no será así.

De todas formas te paso un BAT que creo que haría lo que pretendes, aunque, de momento no hace el renombrado sino que solo genera el comando de renombrado. Si consideras que es correcto solo hay que suprimir el ECHO en cada uno de los FOR:

@echo off
for /f "tokens=1,*" %%a in ('fsutil fsinfo drives') do call :trataunidad %%b
goto :eof
:trataunidad
if "%1"=="" goto :eof
echo Tratando unidad %1
echo Tratando MKVs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mkv') do  echo ren "%%x\%%y\%%z" "%%y.mkv"
echo Tratando MP4s
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mp4') do  echo ren "%%x\%%y\%%z" "%%y.mp4"
echo Tratando AVIs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.avi') do  echo ren "%%x\%%y\%%z" "%%y.avi"
shift
goto :trataunidad

Ya nos dirás si funciona

Estimado Gggirald,

Puedo garantizar que no hay archivos preexistentes con igual extensión o nombre que al momento de renombrar causen conflictos. Cada uno ocupa su propia carpeta. En todo caso el conflicto surgiría para mí, luego, cuando deba mover los renombrados en nivel B hacia el nivel A. Pero eso será harina de otro costal... como se suele decir.

Ahora respecto al código que gentilmente me has enviado:

Hice una estructura experimental de prueba en la unidad F:\prueba, con cinco carpetas.  Quité directamente los ECHO mencionados situados entre DO y REN (en donde parece haber un espacio extra innecesario el cual no creo que altere el funcionamiento del comando, pero que de todos modos eliminé) y no funcionó. 

-Por alguna razón se va directamente a la unidad C:, cuando me encuentro con la carpeta principal en la unidad F:\prueba

-Y ahí no hace nada. Queda colgado y solo muestra la pantalla de la consola

dos  líneas:

Tratando unidad C:\

Tratando MKVs

Aclaro que también trasladé a C:\ la estructura experimental y sucedió lo mismo.

Veamos. Como decías que tanto la unidad como la carpeta principal pueden variar intenté hacer un BAT válido para todas las unidades presentes y todas las carpetas. Pero eso puede ser configurable o tratarlo más adelante. Vamos a centrarnos en F:\prueba.

@echo off
set carpeta=f:\prueba
Echo Tratando carpeta %carpeta%
Pushd %carpeta%
Echo Tratando MKVs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mkv') do echo ren "%%x\%%y\%%z" "%%y.mkv"
echo Tratando MP4s
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mp4') do echo ren "%%x\%%y\%%z" "%%y.mp4"
echo Tratando AVIs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.avi') do echo ren "%%x\%%y\%%z" "%%y.avi"
Popd

De momento mantengo el ECHO para que puedas ver si el comando REN que se generaría es o no el correcto. En todo caso debes darle tiempo al BAT porque un comando como DIR /S puede tardar bastante. Aunque te parezca que se queda colgado puede que no sea así y que esté buscando

Estimado Gggirald,

Al parecer hay un error en la lectura del nivel de carpetas, pues les adjudicó a todos los renombrados el mismo nombre de la carpeta principal: "prueba".

Para que resulte mas comprensible al final de cada FOR le agregué que dirija la salida a una lista.txt para que puedas ver el resultado:

ren "F:\prueba\Pelicula-01 (1957)\Film (1957).mkv" "prueba.mkv"
ren "F:\prueba\Pelicula-05 (1957)\Film\Film-05\Film-05.mkv" "prueba.mkv"
ren "F:\prueba\Pelicula-02 (2016)\Film-02\Film-02.mp4" "prueba.mp4"
ren "F:\prueba\Pelicula-03 (2016)\Film-03\Film-03.mp4" "prueba.mp4"
ren "F:\prueba\Pelicula-04 (2002)\Film-04.avi" "prueba.avi"

Eso es lo que había creído entender de lo que pedías. Ahora se me ocurre que entendí mal y que debería ser así:

@echo off
set carpeta=f:\prueba
Echo Tratando carpeta %carpeta%
Pushd %carpeta%
Echo Tratando MKVs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mkv') do echo ren "%%x\%%y\%%z" "%%z.mkv"
echo Tratando MP4s
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.mp4') do echo ren "%%x\%%y\%%z" "%%z.mp4"
echo Tratando AVIs
for /f "tokens=1,2,* delims=\" %%x in ('dir /s /b %1*.avi') do echo ren "%%x\%%y\%%z" "%%z.avi"
Popd

Mira a ver si ahora está bien. Si no es así ponme lo que sería correcto en cada caso.

Mejor así:

@echo off
set carpeta=f:\prueba
Echo Tratando carpeta %carpeta%
Pushd %carpeta%
Echo Tratando MKVs
for /f "tokens=1,2,3,* delims=\" %%a in ('dir /s /b %1*.mkv') do echo ren "%%a\%%b\%%c\%%d" "%%c.mkv"
echo Tratando MP4s
for /f "tokens=1,2,3,* delims=\" %%a in ('dir /s /b %1*.mp4') do echo ren "%%a\%%b\%%c\%%d" "%%c.mp4"
echo Tratando AVIs
for /f "tokens=1,2,3,* delims=\" %%a in ('dir /s /b %1*.avi') do echo ren "%%a\%%b\%%c\%%d" "%%c.avi"
Popd

Estimado Gggirald,

¡Grandioso! Ahora sí funciona a la perfección.

Era exactamente lo que necesitaba. Quedo muy agradecido contigo.

¡Saludos cordiales!

¡Estupendo! Me alegro muchísimo de que te sirva para algo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas