2009-07-13 10 views
12

tengo un directorio que contiene los archivos y una serie de niveles de subdirectorios:¿Cómo puedo mover los contenidos de un árbol de directorios a otro?

C:\Source 

me gustaría mover el contenido de C: \ Source en:

C:\Destination 

Requisitos:

  • Todos los archivos y todos los subdirectorios dentro de C: \ SourceData se debe mover
  • que va a correr el comando en un archivo por lotes
  • no puedo usar Powershell o otros lenguajes de script

Intento 0

XCOPY /E "C:\Source" "C:\Destination" 

Esto funciona perfectamente, pero copia en lugar de movimientos. No puedo copiar y luego eliminar la fuente porque estoy moviendo un gran conjunto de archivos y no hay suficiente espacio en el disco para tener dos copias a la vez.

Intento 1

MOVE "C:\Source" "C:\Destination" 

Esto mueve todo el directorio C: \ Fuente en C: \ destino por lo que terminan con:

C:\Destination\Source 

Intento 2

Con un poco de ayuda de this question and accepted answer Se me ocurrió:

for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination" 

Esto mueve los archivos dentro de C: \ Source pero no en los subdirectorios o sus contenidos. Tenga en cuenta que utilicé %% x en lugar de% x como lo estoy usando en un archivo por lotes.

Usar FOR parece prometedor pero no estoy seguro de haber usado la sintaxis correcta? ¿Me he perdido algo?

Intento 3

Como se sugiere por Nick D, he intentado cambiar el nombre de:

Cambiar nombre "C: \ Source" Destino

Para el escenario de ejemplo que dio esto funciona bien. Por desgracia mi verdadero destino directorio está en un nivel diferente a la Fuente directorio y esto no parece ser apoyado:

C:\>REN /? 
Renames a file or files. 

RENAME [drive:][path]filename1 filename2. 
REN [drive:][path]filename1 filename2. 

Note that you cannot specify a new drive or path for your destination file. 

consigo "La sintaxis del comando es incorrecta."Errores si intenta especificar una ruta de destino más compleja, por ejemplo:

RENAME "C:\Source" "C:\MyOtherDirectory\Destination" 
RENAME "C:\Source" "MyOtherDirectory\Destination" 
+2

Mientras MOVE moverá la "fuente" * a * "destino" si "destino" ya existe, moverá "origen" * a * "destino" si no existe. –

+0

Si RENAME funcionó como lo deseaba, entonces podría haberse movido a la carpeta correcta con un nombre temporal, y luego renombrado :) – eglasius

Respuesta

8

actualización:

código ajustado a una. compruebe si las carpetas ya existen en el destino, en cuyo caso mueva los archivos en esa carpeta (y continúe atravesando la estructura del directorio de origen), de lo contrario mueva la carpeta al por mayor.

Al final de la secuencia de comandos, la carpeta fuente se elimina por completo para eliminar estas carpetas que han trasladado sus archivos a una carpeta ya existente en el destino (lo que significa que estas carpetas se han vaciado pero no eliminado en la fuente).

Además, verificamos si una carpeta está vacía y si ya existe en el destino, en cuyo caso no hacemos nada (y dejamos la carpeta de origen para ser eliminados en la última línea del script). No hacer esto da como resultado "El nombre del archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecto". errores

¡Uf! ¡Por favor, hágame saber cómo se lleva esto! He probado esto y parece estar funcionando bien.

for /d /r "c:\source" %%i in (*) do if exist "c:\destination\%%~ni" (dir "%%i" | find "0 File(s)" > NUL & if errorlevel 1 move /y "%%i\*.*" "c:\destination\%%~ni") else (move /y "%%i" "c:\destination") 
move /y c:\source\*.* c:\destination 
rd /s /q c:\source 
+0

Necesitaba cambiar el comando FOR para usar %% i en vez de% i (como está en un archivo por lotes) pero aparte de eso funciona muy bien. ¡Gracias! – tjrobinson

+0

¡Yay! Eso realmente fue una suposición para ser honesto. Noté/D en la pantalla de ayuda y tomé una foto ... Actualicé la cosa de %% i :) – ljs

+0

Hmm, tal vez no esté funcionando después de todo. Me sale "El nombre del archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecto". cuando ejecuta el comando mover. – tjrobinson

1

Desde XCOPY funciona, se puede usar XCOPY y DELETE, que es una solución, sino que deben trabajar

+0

Eso funcionaría para muchos casos, pero desafortunadamente no puedo copiar y luego eliminar la fuente como I ' m mover un gran conjunto de archivos y no hay suficiente espacio en disco para tener dos copias de ellos a la vez. He actualizado la pregunta para aclarar esto, debería haberlo mencionado antes. – tjrobinson

1

en Vista utilizar

?
 
robocopy source destination /MIR 

/MIR .. mirror a complete directory tree (also deletes files in the destination) 

demás

 
xcopy 

Por supuesto que hay que eliminar la fuente después :)

+1

Eso funcionaría para muchos casos, pero desafortunadamente no puedo copiar y luego eliminar la fuente, ya que estoy moviendo un gran conjunto de archivos y no hay suficiente espacio en el disco para tener dos copias a la vez. He actualizado la pregunta para aclarar esto, debería haberlo mencionado antes. – tjrobinson

+0

sí, lo haría. Necesitaría robocopy/MOVE not/MIR – Joey

1

que tienen un directorio que contiene archivos y una serie de niveles de subdirectorios:

C: \ Source

me gustaría mover el contenido de C: \ Source en:

C: \ Destino

som Tal vez me falta Todo, ¿pero no puedes cambiar el nombre de la carpeta?

+0

Desafortunadamente, eso no parece funcionar si el directorio de destino no está en el mismo nivel que el directorio de origen. Agregaré más detalles a la pregunta en lugar de este cuadro de comentarios. – tjrobinson

20

Sin duda, utilice robocopy. Es una herramienta simple pero brillantemente útil.

robocopy /move /e sourcedir destdir 

Esto moverá todos los archivos y carpetas, incluyendo las vacías, borrar cada archivo original después de que se ha movido.

Si no tiene instalado robocopy, puede descargarlo solo o como parte de un kit de recursos de Microsoft.

+0

+1: Olvidé que robocopy podía moverse (¡debe ser el nombre!). En mi caso, no puedo confiar en la instalación de robocopy pero podría incluir fácilmente el binario junto con el script. – tjrobinson

+0

Sí, y lo que es bueno es que no tiene ninguna dependencia; es solo un .exe y funciona bien en Vista, Server 2003, 2008, etc. Siempre que pueda almacenarlo con el script, tendrá un proceso robusto y confiable. – DavidMWilliams

1

Como se envió en twitter: Intente combinar el intento 3 con el intento 1. Cambie el nombre para que la carpeta de destino sea correcta, luego mueva "Destino" al lugar correcto.

1
@echo on 
set SOURCE=C:\Source 
set DESTINATION=C:\Destination 

xcopy %SOURCE%\* %DESTINATION%\* /s /e /i /Y 

PAUSE 

uso el archivo por lotes como este ...

o simplemente llamar:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y 
+3

¿Qué hacen esos conmutadores/s/e/i/Y? ¿Lo hacen mover los archivos en lugar de copiarlos? – tjrobinson

0

creo que la cosa más fácil que podría hacer es modificar su intento 2

de

MOVE "C:\Source" "C:\Destination" 

a

MOVE "C:\Source\*" "C:\Destination" 

BESO ;-)

Editar: parece que esto no funciona, así que mi consejo es tirar la maldita línea de comandos de DOS y usar Cygwin con BASH como un caparazón. (o simplemente agregue los binarios de cygwin a la ruta para que pueda usar mv dentro de DOS, sin tener que cambiar el shell como su estado de requisitos).

+1

Eso es muy simple pero no funciona. Los subdirectorios dentro de C: \ Source no se copian – tjrobinson

+0

¿no es así? : -s qué basura ... – fortran

0

Si todo su tratando de hacer es mover un directorio y el contenido hasta un nivel:

MOVE folder_you_wan_to_move .. 

Tenga en cuenta que .. se refiere al siguiente directorio superior.

0

Utilizo una utilidad llamada xxcopy. Puede mover archivos y tienen muchas opciones útiles, se puede utilizar de esta manera:

xxcopy C:\Source C:\Destination /E /RC 

las opciones:

  • /E para copiar todo, incluso las carpetas vacías

  • /RC a eliminar cada archivo fuente después de cada copia exitosa

puede descargar una copia gratuita de xx copiar para uso personal de: http://www.xxcopy.com/xcpydnld.htm

1

Tal vez un poco fuera de tema, pero todavía muy útil:

Algunas personas sugieren que sólo tienes que copiar + borrar los archivos de origen, pero archivos en movimiento no es lo mismo que la copia + eliminando!

Cuando se utiliza el (x) copia función, asignar nuevo espacio en el mismo volumen en un disco duro. Después de copiar los archivos, viejos archivos (el espacio asignado antiguo que se requería para los archivos) se marcan como borrados. Si bien obtendrá el mismo resultado que un usuario final, mudarse hace algo diferente y más eficiente.

Moving archivos en realidad sólo cambia algunos registros en la (tabla maestra de archivos) MFT. Estos cambios solo consisten en una ruta diferente para que el usuario ubique sus archivos. Físicamente, los archivos aún permanecen en los mismos sectores en el disco duro.

+0

Si no está utilizando xcopy o Robocopy, ¿qué sugeriría para mover carpetas? – oro777

1

En respuesta a la respuesta de ufukgun:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y 

/s - Copia directorios y subdirectorios excepto los vacíos.
/e - Copia directorios y subdirectorios, incluidos los vacíos. Igual que/S/E. Puede usarse para modificar/T.
/i - Si el destino no existe y copia más de un archivo, se supone que el destino debe ser un directorio.
/y - Suprime la solicitud para confirmar que desea sobrescribir un archivo de destino existente.

Como se indica en otra respuesta, usar xcopy puede no ser tan eficiente como lo sería un comando de movimiento nativo que solo cambia los punteros en el sistema de archivos.

Cuestiones relacionadas