Línea de comandos de Windows: ¿Cómo copiar subdirectorios, no archivos, en un directorio raíz determinado?

Línea de comandos de Windows: ¿Cómo copiar subdirectorios, no archivos, en un directorio raíz determinado?

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.txty 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 /ADenumera todos los directorios ( /AD), uno por línea ( /B).

  • for /F "delims=" %a in ('...') dopasa por la salida del comando ..., establece la variable %aen la siguiente línea de salida y ejecuta lo que sigue do.

    Aquí, delims=se asegura de que la variable contenga todo el contenido de la línea. Sin él, %asólo se mantendrían los caracteres hasta el primer espacio.

  • xcopy /E "%a" "DESTINATION\%a\"copia el directorio actualmente especificado en %auna carpeta con el mismo nombre en el directorioDESTINO. El /Ecambio hace que también se copie el contenido del directorio. 1

    Es esencial especificar el nombre del directorio en el destino. Sin él, fileA.txtse copiaría a DESTINATION\fileA.txt(en lugar de DESTINATION\A\fileA.txt).

    La barra invertida final se utiliza para indicar que %aes 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, %ase convierte en %%a.


1 /E también copia directorios vacíos. Si no desea esto, puede utilizarlo /Sen 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

información relacionada