Crear Un Batch Que Mueva Carpetas Dentro De Otra Carpetas Con Parte Del Nombre De La Carpeta
Se Puede Crear Un Batch Que Mueva Carpetas Dentro De Otra Carpetas Con Parte Del Nombre De La Carpeta
Ejemplo:
Pepe Luis - Tiene 40 Años
Luis Miguel - Doscientos Cincuenta
Paco Pil - No Tiene Nada
Y Crear Carpetas Con El Nombre
Pepe Luis
Luis Miguel
Paco Pil
Y Dentro De Las Carpetas Creadas Movería Las De Arriba
Quedaría Así
Pepe Luis\Pepe Luis - Tiene 40 Años
Luis Miguel\Luis Miguel - Doscientos Cincuenta
Paco Pil\Paco Pil - No Tiene Nada
1 Respuesta
Si te entiendo bien lo que quieres es que por cada archivo que figura en esa carpeta y que tenga un nombre que responda al esquema "aaaaa - bbbbb" se cree, en esa carpeta, una subcarpeta de nombre "aaaaa" en la que se copie (o mueva, eso no me queda claro) el archivo "aaaaa - bbbbb". Tanto "aaaaa" como "bbbbb" pueden contener espacios. Supongo que si en esa carpeta hubiera archivos con nombres que no responden a ese esquema no se hace nada con ellos.
Prueba este bat (en el que he supuesto que lo que se quiere es moverlos, no copiarlos):
@echo off Setlocal EnableDelayedExpansion set carpeta=c:\tmp\ggg cd %carpeta% for /f "tokens=1,2,* delims=-" %%a in ('dir /b *.*') do ( if not "%%b"=="" ( set sub=%%a set sub=!sub:~0,-1! md "%carpeta%\!sub!" move "%carpeta%\%%a-%%b" "%carpeta%\!sub!" ) )
Deberás sustituir el valor de la variable CARPETA (tercera línea) por lo que te interese. Ya me cuentas si te va bien, mal o regular.
Hola, Gracias por la respuesta.
Lo que me gustaría hacer es.
La carpeta 'Pepe Luis - Tiene 40 Años' contiene una serie de documentos
lo que quiero conseguir es, esa carpeta con los documentos que se muevan a otra carpeta con el nombre Pepe Luis y dentro de esa carpeta estará la carpeta 'Pepe Luis - Tiene 40 Años' con sus respectivos archivos dentro
Quedaría así Pepe Luis\Pepe Luis - Tiene 40 Años\aa.doc, bb.doc, etc
Muchas gracias y perdona por las molestias.
Saludos
Hola con el siguiente código he conseguido crear la carpeta con el mismo nombre dentro de la carpeta.
Lo que no consigo es mover los archivos que se encuentran en la carpeta dentro de la carpeta creada.
@echo off
for /D %%a in (*) do (
md "%%~na\%%~na" 2>nul
)
Y queda así
Pepe Luis - Tiene 40 Años\Pepe Luis - Tiene 40 Años
Pero no tengo claro si te ha servido para resolver tu problema, porque parece que no te había entendido bien. Si todavía no está resuelto podemos seguir intentándolo.
Hola El Bat Funciona Bien, se podria hacer que solo moviera las carpetas y los archivos que tuvieran un enpacio.
Ejemplo:
Pepe Luis\Pepe Luis - Tiene 40 Años
y que no moviera las carpetas que tuvieran de nombre.
Pepe Luis-Tiene 40 Años
es decir que no mueva las carpetas que no tienen espacio -
Saludos
Un problema que he encontrado es que si la carpeta tiene de nombre
Hola-como estas - hola que tal
No la guarda en la subcarpeta la deja en el directorio raíz.
Saludos
No sé si este segundo caso tiene que ver con el que comentabas justo antes. De modo que vayamos por partes. Prueba esta versión:
@echo off Setlocal EnableDelayedExpansion set carpeta=c:\tmp\ggg cd %carpeta% for /f "tokens=1,2,* delims=-" %%a in ('dir /b *.*') do ( set sub=%%a if not "%%b"=="" if "!sub:~-1!"==" " ( set sub=!sub:~0,-1! md "%carpeta%\!sub!" move "%carpeta%\%%a-%%b" "%carpeta%\!sub!" ) )
Esta debería evitar que se aplique el procedimiento cuando el "-" no vaya precedido de un espacio, es decir cuando el nombre del archivo sea algo como "Pepe Luis-Tiene 40 Años". Si esta versión resuelve eso pero no trata bien el otro caso (el del "Hola-como estas - hola que tal") me lo dices y me dices, de paso, como debería actuar en ese caso.
Hola, Lo primero darte la gracias por todo el esfuerzo.
Ahora funciona muy bien, deja sin mover "Pepe Luis-Tiene 40 Años" todo perfecto.
El problema es el que indicas arriba que si la carpeta tiene de nombre "Hola-como estas - hola que tal", no hace nada.
Gracias.
Saludos.
Con este otro bat creo que se resolvería ese caso pero no otros que tengan más "-" en el nombre. Si esa circunstancia puede darse habría que estudiar el asunto más a fondo.
@echo off Setlocal EnableDelayedExpansion set carpeta=c:\tmp\ggg cd %carpeta% for /f "tokens=1,2,* delims=-" %%a in ('dir /b *.*') do ( set sub=%%a if not "%%b"=="" if "!sub:~-1!"==" " ( set sub=!sub:~0,-1! md "%carpeta%\!sub!" move "%carpeta%\%%a-%%b-%%c" "%carpeta%\!sub!" ) )
Hola, insertando la ultima línea del ultimo bat, en el bat anterior mueve a la misma carpeta:
Pepe Luis\Pepe Luis - Tiene 40 Años
\Pepe Luis - Tiene 40-Años
Pero se queda en el directorio raíz \Pepe-Luis - Tiene 40 Años
@echo off
Setlocal EnableDelayedExpansion
set carpeta=c:\tmp\ggg
cd %carpeta%
for /f "tokens=1,2,* delims=-" %%a in ('dir /b *.*') do (
set sub=%%a
if not "%%b"=="" if "!sub:~-1!"==" " (
set sub=!sub:~0,-1!
md "%carpeta%\!sub!"
move "%carpeta%\%%a-%%b" "%carpeta%\!sub!"
::Línea del ultimo bat
move "%carpeta%\%%a-%%b-%%c" "%carpeta%\!sub!"
)
)
Saludos.
Perdona que no te haya dicho nada. He estado un poco liado. No entiendo muy bien que es lo que has hecho cuando dices "... insertando la ultima línea del ultimo bat, en el bat anterior..." . Lo que yo pretendía es que usaras ese último BAT tal cual lo escribí. Debería valer tanto para los casos anteriores como para el de "Hola-como estas - hola que tal".
Aprovecho para decirte que es más cómodo y más claro que incluyas el código en una ventanita aparte, como las que salen en mis mensajes. Para ello solo tienes que incluirlo en un "snippet" que se consigue utilizando el icono "<>" de la barra de herramientas de la página (el tercero desde la derecha).
Hola probé el Ultimo bat que hiciste y solo mueve las carpetas que llevan dos guiones.
Ejemplo:
Hola - como estas - hola que tal
y
Hola - como estas-hola que tal
"Si solo lleva un guion no la mueve"
Saludos y Gracias.
A ver si conseguimos cerrar favorablemente este asunto. Aprovechando el bat que facilité ayer para otra consulta se me ha ocurrido probar este y creo que tiene posibilidades:
@echo off Setlocal EnableDelayedExpansion set carpeta=d:\carpeta prueba cd %carpeta% for /f "tokens=1,* delims=-" %%a in ('dir /b *.*') do ( set sub=%%a if not "%%b"=="" if "!sub:~-1!"==" " ( set sub=!sub:~0,-1! md "%carpeta%\!sub!" move "%carpeta%\%%a-%%b" "%carpeta%\!sub!" ) )
Si funciona bien, solo debe crear subcarpeta y mover archivo si el nombre del archivo sigue el esquema "aaaaaa - bbbbb" o "aaaaa -bbbbb" en el que la parte "bbbbb" puede contener un número indefinido de guiones precedidos o no de espacios. En los demás casos no debe hacer nada (por ejemplo con esquema "aaaaa-bbbbb" o "aaaaa- bbbbb"). Si no funciona bien ponme solo los casos en que cumpliendo el primer esquema no se hace nada o cumpliendo el segundo se hace algo.
Me acabo de dar cuenta de que no estoy contemplando los casos en que en la parte "aaaaa" del nombre existan guiones sin espacios. Si ese fuera el problema prueba este otro BAT:
@echo off set carpeta=d:\carpeta prueba cd %carpeta% for /f "tokens=*" %%a in ('dir /b *.* ^| find " -"') do call :tratar %%a goto :eof :tratar set nombre=%1 set control=N :bucle if "%1"=="" ( md "%carpeta%\%sub%" move "%carpeta%\%nombre%" "%carpeta%\%sub%" goto :eof ) if %control%==N set sub=%1&set sig=%2 set nombre=%nombre% %2 if "%sig:~0,1%"=="-" if %control%==N set control=S shift goto :bucle
Este usa como nombre de la subcarpeta todo lo que precede al primer " -" independientemente de que contenga o no guiones sin espacio.
Hola, con el ultimo Bat funciona a la perfección guarda estas variables probadas.
Hola - como estas - hola que tal
Hola - como estas - hola que tal - bien
Ho-la - como estas-hola que tal
Muchísimas Gracias por todo y perdona por las molestias.
Saludos
Me alegro mucho. Y, como ya imaginarás, me gustan este tipo de cosas, de modo que no hay mucho que agradecer.
Hola, perdona que te moleste he llevado a la practica el Bat y me he encontrado con el problema que solo crea la carpeta con la palabra anterior al guion.
Ejemplo:
Hola Que Tal - Como Estas, crea la carpeta Tal.
Luego Hola - Como Estas, crea la carpeta Hola.
He probado varios casos y siempre ocurre lo mismo. Siempre la palabra anterior al guion.
Saludos.
Tienes toda la razón. Hoy y mañana no voy a tener mucho tiempo para probar pero a lo mejor con esto se soluciona:
@echo off set carpeta=d:\carpeta prueba cd %carpeta% for /f "tokens=*" %%a in ('dir /b *.* ^| find " -"') do call :tratar %%a goto :eof :tratar set nombre=%1 set control=N :bucle if "%1"=="" ( md "%carpeta%\%sub%" move "%carpeta%\%nombre%" "%carpeta%\%sub%" goto :eof ) if %control%==N set sub=%nombre%&set sig=%2 set nombre=%nombre% %2 if "%sig:~0,1%"=="-" if %control%==N set control=S shift goto :bucle
Solo he cambiado la cuarta línea desde abajo.
En otro hilo (Cambiar De Nombre Solo Un Archivo ) me pides una modificación sobre este BAT para que la carpeta creada lo sea con la primera letra del nombre en lugar de todo lo que precedía al "-". Creo que esto puede funcionar como quieres:
@echo off set carpeta=C:\Users\Toni\Desktop\01 - Comprimir cd %carpeta% for /f "tokens=*" %%a in ('dir /b *.* ^| find " -"') do call :tratar %%a goto :eof :tratar set nombre=%1 set control=N :bucle if "%1"=="" ( if not exist "%carpeta%\%sub:~0,1%" md "%carpeta%\%sub:~0,1%" move "%carpeta%\%nombre%" "%carpeta%\%sub:~0,1%" goto :eof ) if %control%==N set sub=%nombre%&set sig=%2 set nombre=%nombre% %2 if "%sig:~0,1%"=="-" if %control%==N set control=S shift goto :bucle
Perdón, para comprobar la existencia de una carpeta no vale la sintaxis del IF NOT EXIST tal como está. Debería ser:
if not exist "%carpeta%\%sub:~0,1%\*.*" md "%carpeta%\%sub:~0,1%"
¿La carpeta
C:\Users\Toni\Desktop\01 - Comprimir
es la adecuada? ¿Hay algún archivo ahí que necesite el tratamiento previsto?
Si fuera así captura el pantallazo de la ejecución y ponlo por aquí. Si ejecutas directamente desde el explorador pon un PAUSE en el bat, antes del primer GOTO :EOF para poder hacer la captura.
En lo que yo veo no aparece ningún archivo con guión, aparecen carpetas con "&". En esas condiciones creo que es normal que no haga nada.
No tengo muy claro que estuviera pensado para carpetas. Yo he trabajado solo con archivos individuales. Lo probaré y te digo algo.
La carpeta a trabajar quedaría así
Las carpeta que empieza por A en dentro de una carpeta A, C con C así sucesivamente.
Gracias.
Entiendo, ahora, que las "especificaciones" son diferentes:
1. Se trata de mover íntegramente todas las carpetas de un directorio/carpeta configurable (con su contenido, claro) a otra carpeta que empieza por la misma letra.
2. Ahora no importa que contengan o no guiones en su nombre.
3. Si la carpeta de una sola letra no existiera se crea.
4. No se distinguen mayúsculas y minúsculas, aunque la carpeta de una sola letra estará nombrada en mayúsculas
Esas carpetas contienen dentro unos archivos se trata de pasar esas carpetas con su contenido y sin variar el nombre a una carpeta que empiece por la primera letra.
No importan los güines.
Por ejemplo Ana Frank a la carpeta A.
Por lo general La primera letra de la carpeta empezaría con mayúsculas.
Perdona por causarte tantas molestias.
Gracias.
Prueba con esto:
@echo off Setlocal EnableDelayedExpansion set carpeta=d:\carpeta prueba cd %carpeta% for /f "tokens=*" %%a in ('dir /b /ad') do ( set nombre=%%a if not exist "%carpeta%\!nombre:~0,1!" md "%carpeta%\!nombre:~0,1!" move "%carpeta%\!nombre!" "%carpeta%\!nombre:~0,1!" )
- Compartir respuesta