Copie archivos sin sobrescribir

99

Parece que no puedo encontrar una manera en la línea de comando para decir "copie todos los archivos del directorio A al directorio B, pero si el archivo ya existe en el directorio B, no lo sobrescriba, no importa qué archivo sea más nuevo y no me preguntes ".

He pasado por copiar, mover, xcopy y robocopy, y lo más cercano que puedo conseguir es que puede decirle a robocopy "copiar A a B, pero no sobrescribir archivos más nuevos con archivos más antiguos", pero eso no me funciona . Miré xxcopy, pero lo descarté, ya que no quiero tener una dependencia de terceros en un evento posterior a la compilación de Visual Studio que requiera que otros usuarios de SVN tengan instalada esa herramienta para realizar la compilación.

Quiero agregar una línea de comando al evento posterior a la compilación en Visual Studio 2010 para que los archivos que se generan a partir de las plantillas T4 para los nuevos objetos del modelo EF se distribuyan a las carpetas del proyecto a las que pertenecen, pero los archivos regenerados para los objetos existentes. no sobrescriba los archivos de destino potencialmente editados.

Dado que la plantilla T4 se regenera, el archivo fuente es siempre más nuevo y no creo que pueda usar el modificador "más nuevo" de manera confiable.

Utilizo clases parciales para aquellos elementos para los que puedo, pero hay otras cosas que genero que no pueden usar clases parciales (por ejemplo, generar un archivo EditorTemplate o DisplayTemplate * .ascx predeterminado).

¿Alguien tiene algún problema similar que haya resuelto?

Tony
fuente
¿Está familiarizado con cmd.exeel forcomando de? Si no es así, le recomiendo que lo ejecute for /?y lo use.
Gabe

Respuestas:

38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Stu
fuente
5
Esto funcionó para mí, pero tuve que usar dos símbolos por ciento en lugar de uno ya que estaba ejecutando esto desde dentro de un archivo por lotes en lugar de la línea de comando. Reemplacé las instancias de% F con %% F y las instancias de% ~ nxF con %% ~ nxF.
Owen
1
Lo que ~nxen %~nxFdecir exactamente?
Serge Rogatch
@stu, solo dice que ~nxFla variable se Fconvierte en un nombre de archivo y una extensión.
Serge Rogatch
Sí, de manera efectiva, dame el nombre de archivo + extensión, sin la ruta, que es lo que necesitas para hacer la prueba en la carpeta de destino y especificar el nombre de archivo de destino. El caso es que% F incluye la ruta y no la quiere allí.
Stu
207

Robocopy , o "Copia robusta de archivos", es un comando de replicación de directorio de línea de comandos. Ha estado disponible como parte del Kit de recursos de Windows a partir de Windows NT 4.0 y se introdujo como una característica estándar de Windows Vista, Windows 7 y Windows Server 2008.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Para elaborar (usando Hydrargyrum, HailGallaxar y Andy Schmidt responde):

  • /E hace que Robocopy copie subdirectorios de forma recursiva, incluidos los vacíos.
  • /XCexcluye los archivos existentes con la misma marca de tiempo, pero de diferentes tamaños. Robocopy normalmente los sobrescribe.
  • /XNexcluye los archivos existentes más nuevos que la copia en el directorio de destino. Robocopy normalmente los sobrescribe.
  • /XOexcluye los archivos existentes más antiguos que la copia en el directorio de destino. Robocopy normalmente los sobrescribe.

Con las clases cambiadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que quiere el póster original, sin necesidad de cargar un entorno de secuencias de comandos.

Referencias: Technet , Wikipedia
Descarga de: Enlace de descarga de Microsoft (enlace verificado por última vez el 30 de marzo de 2016)

Dr. belisario
fuente
Por "excluir", ¿te refieres a "omitir" o "eliminar / eliminar"?
Ataque aéreo
@Andre Terra: Saltar, normalmente. Si está utilizando el indicador / MIR, es posible que los elimine. No lo he probado.
Hydrargyrum
Con / MIR, los archivos que no existen en la fuente se eliminan. Pero cuando también se usa / XN y / XO, los archivos que existen en ambos lugares simplemente se omiten (no estoy seguro de si el tamaño está marcado). Esto es ideal para mi situación en la que necesito copiar una versión más nueva o anterior de mi aplicación, pero donde los sellos dateModified de las bibliotecas que usa la aplicación son incorrectos, pero los nombres de los archivos contienen su número de versión.
Henno Vermeulen
¿Es necesario incluir /e? ¿Y si usa /sen su lugar? No quiero un montón de subcarpetas vacías.
Arete
48

La solución de Belisarius es buena.

Para desarrollar esa respuesta ligeramente concisa:

  • /E hace que Robocopy copie subdirectorios de forma recursiva, incluidos los vacíos.
  • /XCexcluye los archivos existentes con la misma marca de tiempo, pero de diferentes tamaños. Robocopy normalmente los sobrescribe.
  • /XNexcluye los archivos existentes más nuevos que la copia en el directorio de origen. Robocopy normalmente los sobrescribe.
  • /XOexcluye los archivos existentes más antiguos que la copia en el directorio de origen. Robocopy normalmente los sobrescribe.

Con las clases cambiadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que quiere el póster original, sin necesidad de cargar un entorno de secuencias de comandos.

Hydrargyrum
fuente
46

Puedes probar esto:

echo n | copy /-y <SOURCE> <DESTINATION>

-ysimplemente solicita antes de sobrescribir y podemos canalizar n a todas esas preguntas. Entonces, esto, en esencia, solo copiaría archivos no existentes. :)

sachin11
fuente
2
Maravillosamente simple.
Fiesta el
6
¿Por qué responde todas las preguntas cuando solo canalizamos una vez?
phuclv
Impresionante, fui con esta opción. Antes de pensar en la tubería, busqué en Google un parámetro que pensé que me faltaba y luego encontré esta página. Al probar esta solución, noté que cuando se canaliza, copiar aparentemente habilita el parámetro / Y, por eso es que se debe agregar / -Y.
Andrew
2
@phuclv Parece que copy /-yasume automáticamente No una vez que stdin se queda sin entrada. Puede omitir el primer explícito no canalizarlo < nul, y sucede lo mismo.
mwfearnley
6

Aquí está en forma de archivo por lotes:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Gabe
fuente
3

Solo quiero aclarar algo de mis propias pruebas.

@Hydrargyrum escribió:

  • / XN excluye los archivos existentes más recientes que la copia en el directorio de origen. Robocopy normalmente los sobrescribe.
  • / XO excluye los archivos existentes más antiguos que la copia en el directorio de origen. Robocopy normalmente los sobrescribe.

En realidad, esto es al revés. XN "eXcluye los archivos más nuevos" pero excluye los archivos que son más nuevos que la copia en el directorio de destino . XO "eXcluye los más antiguos", pero excluye los archivos que son más antiguos que la copia en el directorio de destino .

Por supuesto, haz tus propias pruebas como siempre.

GranizoGallaxar
fuente
1
¿Es esta una respuesta a la pregunta original o un comentario sobre la respuesta de otra persona?
ASGM
1
¿Es la respuesta de Hydrargyrum que tiene +25 votos al momento de escribir una respuesta a la pregunta original, o un comentario sobre la respuesta de otra persona?
mes.
3

Hay una forma extraña de hacer esto con xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Simplemente incluya tantos n como archivos que esté copiando, y responderá n a todas las preguntas de sobrescritura.

Adam dice: restablecer a Monica
fuente
Con respecto copy, vea esta respuesta , específicamente el comentario de @mwfearnley: copy /-yse asume automáticamente nuna vez que stdin se agota, por lo que puede, por ejemplo, echo nsolo una vez y aún funciona.
rsenna
3
robocopy src dst /MIR /XX

/ XX: Excluir archivos y directorios "eXtra" (presentes en el destino pero no en la fuente). Esto evitará cualquier eliminación del destino. (este es el predeterminado)

be_good_do_good
fuente
1

Robocopy se puede descargar aquí para sistemas donde aún no está instalado. (Es decir, Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (no es necesario reiniciar para la instalación)

Recuerde establecer su ruta al exe robocopy. Haga esto haciendo clic derecho en "mi computadora"> propiedades> avanzado> "Variables de entorno", luego busque la variable de sistema de ruta y agregue esto al final: "; C: \ Archivos de programa \ Kits de recursos de Windows \ Herramientas" o donde sea que lo instaló. Asegúrese de dejar las cadenas de variables de ruta que ya están allí y simplemente agregue la ruta adicional.

una vez que se establece la ruta, puede ejecutar el comando que sugiere belisarius. Funciona muy bien.

Greg
fuente
1

No me permitirá comentar directamente sobre los mensajes incorrectos, pero permítanme advertirles a todos que la definición de las opciones / XN y / XO está INVERTIDA en comparación con lo que se ha publicado en mensajes anteriores.

La opción Excluir archivos más antiguos / más nuevos es coherente con la información que se muestra en el registro de RoboCopy: RoboCopy iterará a través de la FUENTE y luego informará si cada archivo en la FUENTE es "MÁS VIEJO" o "MÁS NUEVO" que el archivo en el destino.

En consecuencia, / XO excluirá los archivos de ORIGEN ANTIGUO (que es intuitivo), no "más antiguos que el origen" como se ha afirmado aquí.

Si desea copiar solo archivos de origen nuevos o modificados, pero evitar reemplazar archivos de destino más recientes, entonces / XO es la opción correcta para usar.

Andy Schmidt
fuente
0

Un enfoque simple sería usar la opción / MIR para reflejar los dos directorios. Básicamente, copiará solo los archivos nuevos al destino. En el siguiente comando y reemplace la fuente y el destino con las rutas a sus carpetas, el script buscará cualquier archivo con cualquier extensión.

robocopy <source directory> <destination directory> *.* /MIR
Ionut V.
fuente
0

Esto es lo que me ha funcionado. Utilizo esto para "agregar" archivos a la otra unidad, sin sobrescribirlos.

Archivo por lotes: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Ejemplo:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Pruebe antes de la implementación.

Ramesh
fuente