Copiar todos los archivos que contengan un nombre especifico para la carpeta del nombre especificado.

Tengo una carpeta que contiene varios archivos de nombre por ejemplo Alabama1.pdf, Alabama2.pdf, Alabama3.pdf, Ohio1.pdf, Ohio2.pdf, Florida1.pdf, Florida3.pdf y tengo carpetas con cada nombre Alabama, Ohio, Florida y necesito copiar todos los archivos que contengan en el nombre Alabama para la carpeta Alabama, todos los que contengan Ohio a la carpeta Ohio y asi para todos los ficheros de la carpeta.

¿Alguna idea?

Aleida

2 respuestas

Respuesta
1

Me faltan algunos datos:

1. ¿El formato de los archivos a copiar es así de "rígido": aaaaaaN.pdf, donde aaaaaa es un texto y N un único número?

2. La carpeta de origen, en la que están los archivos que se quieren copiar, ¿es distinta de la carpeta destino, en la que están las subcarpetas donde deben copiarse los archivos?

Suponiendo que la respuesta a estas dos preguntas es afirmativa, he preparado esto que podría servirte:

@echo off
Setlocal EnableDelayedExpansion
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b "%corigen%\*.pdf"') do (
   set nombre=%%~na
   set nombre=!nombre:~0,-1!
   if exist "%cdestino%\!nombre!" copy "%corigen%\%%a" "%cdestino%\!nombre!"
   )
goto :eof

Tendrías que rellenar el CORIGEN con la ubicación de la carpeta en la que están los archivos que quieres copiar y CDESTINO con la ubicación de la carpeta de la que cuelgan las carpetas de destino. Pueden ser iguales y también puede ser que la carpeta sea solo un nombre de unidad si están en el directorio raíz (por ejemplo "set cdestino=d:"). Si quieres puedes probarlo aunque para las pruebas te sugiero que antes del COPY pongas un ECHO para poder ver la sintaxis del comando antes de ejecutarlo. Si se ajusta a lo que esperas borras el ECHO y dejas que se ejecute el COPY.

Hola ggg! Muy buenos dias..

Muchas gracias.. Respuesta a tus preguntas, vi que no me explique bien en mi pregunta,

1. ¿El formato de los archivos a copiar es así de "rígido": aaaaaaN.pdf, donde aaaaaa es un texto y N un único número?...

No es rigido el texto " "aaaaa" forma parte del nombre del archivo origen y puede estar incluido en mas de un archivo de origen y cualquier posicion del nombre del archivo y N puede o no estar presente en el nombre del archivo.

Ejemplo:

Carpeta Origen puede tener archivos aaaaa1, aaaaa2, aaaaa5, bbbbb, bbbbb3 ... etc etc 

La Carpeta Destino tiene subcarpetas ya creadas con los nombres: 

aaaaa

bbbbb

Y necesito copiar todos los archivos que incluyan en su nombre el texto "aaaaa" a la carpeta  de nombre aaaaa, todos los archivos que tengan en el nombre el texto "bbbbb" para la carpeta bbbbb, o sea cada nombre de las subcarpetas destino es la cadena de texto a buscar en el nombre de los ficheros de la Carpeta Origen y son los archivos que tengo que copiar para esa carpeta.. Logro explicarme?

2. La carpeta de origen, en la que están los archivos que se quieren copiar, ¿es distinta de la carpeta destino, en la que están las subcarpetas donde deben copiarse los archivos?

si, Correcto

Muchas gracias por su tiempo..

Aleida

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do copy "%corigen%\%%x" "%cdestino%\%%a"
   )
goto :eof

Perdón, ahora no es necesario el segundo comando. Sería así:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do copy "%corigen%\%%x" "%cdestino%\%%a"
   )
goto :eof

Funciono perfecto! Genial... el único detalle que en la Carpeta Origen puede tener subcarpetas que incluyen el texto "aaaaa" y debe copiarse la subcarpeta también con todos sus ficheros para la carpeta correspondiente Destino.

Muchas gracias.. Aleida

A ver si esto lo resuelve:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (
      if exist "%corigen%\%%x\*.*" (xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"
         ) else copy "%corigen%\%%x" "%cdestino%\%%a"
      )
   )

Este perfecto, ya copia la subcarpeta con los ficheros que contiene, pero me los copia doble,. Copia los ficheros dentro de la subcarpeta y fuera.

Pues no lo entiendo. A mí no me ocurre eso.
Ponme por aquí el bat que usas (corrigiendo, si quieres, los nombres de las carpetas por si fuera "información sensible") para ver si hay algo que lo explique.

¿Has abandonado este asunto? Me gustaría aclarar el punto pendiente.

Hola Buenos días ggg!

Disculpe no haberle podido responder de inmediato, he estado tan complicada en el trabajo que lo que me ha copiado doble lo estoy borrando a mano, espero en un rato poderle darle todos los detalles.

Un saludo y disculpe nuevamente.

Aleida

No te preocupes. No quería presionarte, era solo que si me olvido de los temas luego no recuerdo en que punto me quedé. Cosas de la edad.

En el carpeta origen tengo los siguientes ficheros y subcarpetas,

AAAAA.dbf

AAAAA_3602.pdf

AAAAA_trays.pdf

AAAAA_pallets.pdf

Una subcarpeta “AAAAA” y dentro de esta carpeta tengo ficheros con nombres:

                                  AAAAA.cpt

                                  AAAAA.txt

                                  AAAAA.csm  

Cuando se realiza la copia a la carpeta destino AAAAA

Copia bien la estructura pero los ficheros que están dentro de la subcarpeta AAAAA destino los copia también fuera quedando como:

AAAAA.dbf

AAAAA_3602.pdf

AAAAA_trays.pdf

AAAAA_pallets.pdf

Subcarpeta AAAAA

AAAAA.cpt

AAAAA.txt

AAAAA.csm

Entonces cuando voy a la subcarpeta AAAAA aparecen también estos archivos

AAAAA.cpt

AAAAA.txt

AAAAA.csm

 Por eso le decía que tengo estos repetidos.

El script fue el mismo que ud me envio solo cambiando el origen y destino aquí se lo anexo.

@echo off

set corigen=Y:\Stage

set cdestino=Y:\USG

for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (

   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (

      if exist "%corigen%\%%x\*.*" (xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"

         ) else copy "%corigen%\%%x" "%cdestino%\%%a"

      )

   )

goto :eof

Pues sigue siendo inexplicable. He reproducido, razonablemente, tu entorno de pruebas como puedes ver en los pantallazos adjuntos, he copiado y pegado el bat tal como me lo has pasado (solo he cambiado los valores de las carpetas origen y destino) y no me ocurre lo que comentas, como puedes ver también en los pantallazos:

En este primer pantallazo te muestro el contenido de la carpeta origen (d:\carpeta prueba) y su única subcarpeta (d:\carpeta prueba\AAAAA) que siguen los nombres que me has indicado y el de la carpeta destino que no tiene nada.

En este segundo pantallazo te muestro el BAT (aleida1.bat), los mensajes de copia que provocan la ejecución del BAT y el nuevo contenido de la carpeta destino y de su única subcarpeta (creada ahora).

En este tercero termino de mostrar el contenido de la carpeta destino.

Incluyo comandos TIME para que puedas asegurarte de que ha sido todo consecutivo.

Solo se me ocurre que la forma de ejecutar el BAT no sea como la que utilizo yo, que es desde una ventana CMD/Símbolo del sistema. Si no fuera así, prueba a hacerlo así, antes de que sigamos investigando las causas. Te sugiero que pruebes en un entorno "reducido" para que no tengas que corregir demasiadas cosas.

Y aprovecho para comentarte que si quieres usar ventanitas independientes, como las que uso yo para incluir el código, la herramienta "<>" (o "snippet") te permite hacerlo.

¡Gracias! Ya funcionaba todo bien! PERFECT... Discúlpeme..

El problema era que desde que se copiaron la primera vez sin estructura de carpeta/subcarpeta los ficheros quedaron esos ficheros en las carpetas y después, ya cuando se copiaron bien, yo seguía viendo los ficheros afuera y adentro. Ahora borre todo el contenido antes de ejecutar el .bat

Por lo que esto me fuera muy necesiario hacerlo .. como hacer para que antes del copy, borrar todo lo que exista en la carpeta,¿así garantizo que no se quede ninguna información anterior?

Había pensado en algún momento que esa podía ser la causa, pero creía que las pruebas anteriores no habrían copiado los archivos de las subcarpetas y por eso no lo comenté como posibilidad.

Para el borrado que pides prueba esto:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (
      if exist "%corigen%\%%x\*.*" (rd /s /q "%cdestino%\%%a\%%x"
         xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"
         ) else copy /y "%corigen%\%%x" "%cdestino%\%%a"
      )
   )

He quitado el "goto :eof" final porque creo que es innecesario

¡Gracias ggg! Muchas gracias por su tiempo y dedicación! Funciono todo bien..

¿Otra preguntica cuando me decía de usar ventanitas independientes( la herramienta "<>" ) es que el código lo escribo dentro de < ..>? ¿Y sale en las ventanitas?

No. Me refiero al icono "<>" de la barra de herramientas de la página:

(El tercero por la derecha). Al pulsar en él se te abre una ventanita en la que puedes copiar lo que quieras.

Por cierto, si ya está resuelta tu consulta ciérrala.

Espero que haya quedado claro. Pero insisto en que cierres la consulta, y "califiques" la respuesta.

Respuesta

usa filecopy de vb.net

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas