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

Respuesta
1

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

Hola He probado el bat y funciona a la perfección.

Muchas gracias por todo.

Saludos

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.

Hola, He probado el ultimo Bat y con los ejemplos de antes funciona bien.

Muchas gracias.

Saludos.

Me alegro.

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%"

Hola No funciona no hace nada.

He modificado la línea y tampoco.

Saludos

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

Ejecuto Desde la carpeta.

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.

He probado de esta forma y tampoco

No tengo muy claro que estuviera pensado para carpetas. Yo he trabajado solo con archivos individuales. Lo probaré y te digo algo.

Ok Gracias, Si es mucha molestia no te molestes.

Muchas gracias.

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!"
   )

Muchísimas ¡Gracias!, Funciona perfectamente.

Saludos

Como ves es bastante más sencillo, porque las "especificaciones" lo son

Al principio quería una cosa, pero luego me he dado cuenta que de este modo es mejor.

Muchísimas gracias por toda la ayuda.

Muy bien. Me alegro de haberte ayudado

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas