Tengo una jerarquía de archivos como esta:
RootDir
/A
/fileA.txt
/B
/C
/fileC.txt
/fileB.txt
/otherFile1.txt
/otherFile2.txt
Me gustaría copiar sólo los subdirectorios (es decir A
, B
) ytodo debajo de ellos(lo que significa que quiero copiar todo EXCEPTO otherFile1.txt
y otherFile2.txt
).
Hay muchos más de 2 directorios y 2 archivos en el directorio raíz, por lo que prefiero no especificar cada uno por su nombre.
¿Alguna sugerencia?
Respuesta1
Puedes usar una combinación depara /f,xcopiarydirectoriopara realizar esta tarea:
cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"
Cómo funciona:
Una vez que ingresas alFUENTEdirectorio, el comando
dir /B /AD
enumera todos los directorios (/AD
), uno por línea (/B
).for /F "delims=" %a in ('...') do
pasa por la salida del comando...
, establece la variable%a
en la siguiente línea de salida y ejecuta lo que siguedo
.Aquí,
delims=
se asegura de que la variable contenga todo el contenido de la línea. Sin él,%a
sólo se mantendrían los caracteres hasta el primer espacio.xcopy /E "%a" "DESTINATION\%a\"
copia el directorio actualmente especificado en%a
una carpeta con el mismo nombre en el directorioDESTINO. El/E
cambio hace que también se copie el contenido del directorio. 1Es esencial especificar el nombre del directorio en el destino. Sin él,
fileA.txt
se copiaría aDESTINATION\fileA.txt
(en lugar deDESTINATION\A\fileA.txt
).La barra invertida final se utiliza para indicar que
%a
es el nombre de un directorio, no un archivo. Las comillas dobles son necesarias para manejar correctamente los nombres de directorios que contienen espacios.
Si este comando se va a utilizar dentro de un archivo por lotes, todos los signos de porcentaje deben ir acompañados de un segundo signo de porcentaje, es decir, %a
se convierte en %%a
.
1 /E
también copia directorios vacíos. Si no desea esto, puede utilizarlo /S
en su lugar.
Respuesta2
Similar a las respuestas de Dennis y David Ruhmann, pero usando un bucle FOR/D en lugar de FOR/F.
for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"
Respuesta3
La mejor manera que se me ocurre es usar el interruptor "/crear" de Robocopy, que copia solo toda la estructura de carpetas, y "solo archivos de longitud 0", lo que estoy seguro conduciría a que se excluyan todos sus archivos.
Robocopy /e /create \(ruta de origen de la carpeta A) \(ruta de destino)
Robocopy /e /create \(ruta de origen de la carpeta B) \(ruta de destino)
También puede (si todos son del mismo tipo de archivo, o una pequeña cantidad de tipos de archivo conocidos) usar el modificador "Excluir archivo" "/xf" y asignar comodines a los tipos de archivo, de esta manera:
Robocopy /e (ruta de origen de la carpeta A) (ruta de destino) /xf *.txt
Robocopy /e (ruta de origen de la carpeta B) (ruta de destino) /xf *.txt
Respuesta4
Solución CMD nativa de Windows. Copie solo las subcarpetas (y su contenido) de un RootDir.
for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i