Tengo un gran conjunto de archivos (más de 45.000) en una estructura de carpetas bastante compleja. Extraje un subconjunto de ~13.000 archivos y sus rutas (relativas a la carpeta raíz) que quiero copiar con la ruta de la carpeta original.
Aunque busqué a fondo, no pude encontrar una manera, con xcopy o robocopy, de hacer lo que quiero. Podría crear fácilmente un archivo por lotes con un comando de copia para cada entrada de mi lista. Sin embargo, no pude encontrar ningún modificador x/robocopy o combinaciones de modificadores que generen la ruta de la carpeta en el destino desde mi archivo fuente, por ejemplo:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
o
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
Me gustaría que creara la ruta dir1\dir2\dir3
si no existe en la carpeta copy_folder
y colocara una copia file.txt
allí. Entiendo que en Linux cp --parent
hace exactamente eso.
¡Cualquier sugerencia sobre la mejor manera de lograrlo es bienvenida!
Respuesta1
XCOPY creará las carpetas si no existen, pero primero le preguntará si el destino es un archivo o un directorio.
Por lo tanto, puede canalizar la respuesta F al comando XCOPY para que el comando no se detenga.
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
La /Y
opción se utiliza en caso de que tenga duplicados en su lista; no desea que el comando XCOPY le pregunte si desea sobrescribir.
La redirección de stderr a nul es necesaria en caso de que la ruta exista, en cuyo caso el lado derecho puede completarse antes que el izquierdo, lo que hace que el izquierdo imprima el siguiente mensaje de error en stderr: The process tried to write to a nonexistent pipe.
la redirección oculta el mensaje de error no deseado.
Otra opción es crear primero la ruta de destino antes de realizar XCOPY. Simplemente redirija stderr a nulo para evitar ver un mensaje de error si la ruta ya existe.
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
Con cualquiera de las soluciones, si la ruta de su lista incluye una letra de unidad, deberá usarla
"copyFolder%%~pnxF"
en lugar de "copyFolder\%%~F"
. Tenga en cuenta que el ~p
modificador incluye el encabezado \
.