Copie archivos sin sobrescribir

Parece que no puedo encontrar un camino en la línea de comando para decir “copiar todos los archivos del directorio A al directorio B, pero si el archivo ya existe en el directorio B, no lo sobrescriba, sin importar qué archivo sea más reciente , y no me pidas “.

He pasado por copy, move, xcopy y robocopy, y lo más cercano que puedo obtener es que usted puede decirle a robocopy “copiar A a B, pero no sobrescribir archivos más nuevos con archivos más antiguos”, pero eso no funciona para mí . Miré xxcopy, pero lo descarté, ya que no quiero tener una dependencia de terceros en un evento de post-construcción de Visual Studio que requerirá que otros usuarios de SVN tengan esa herramienta instalada para hacer la comstackción.

Quiero agregar una línea de comando al evento posterior a la construcción en Visual Studio 2010 para que los archivos generados 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 se regeneren los archivos para objetos existentes no sobrescriba archivos de destino potencialmente editados.

Dado que la plantilla T4 se regenera, el archivo fuente siempre es más nuevo y no puedo usar el conmutador “nuevo” de manera confiable, no creo.

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

¿Alguien tiene problemas similares que hayan resuelto?

 For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF" 

Robocopy , o “Robust File Copy”, es un comando de replicación de directorios 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 (utilizando las respuestas de Hydrargyrum, HailGallaxar y Andy Schmidt):

  • /E hace que Robocopy copie recursivamente subdirectorios, incluidos los vacíos.
  • /XC excluye los archivos existentes con la misma marca de tiempo, pero diferentes tamaños de archivo. Robocopy normalmente sobrescribe aquellos.
  • /XN excluye los archivos existentes más nuevos que la copia en el directorio de destino. Robocopy normalmente sobrescribe aquellos.
  • /XO excluye los archivos existentes anteriores a la copia en el directorio de destino. Robocopy normalmente sobrescribe aquellos.

Con las clases modificadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que desea el póster original, sin necesidad de cargar un entorno de scripting.

Referencias: Technet , Wikipedia
Descargar desde: Enlace de descarga de Microsoft (último enlace verificado el 30 de marzo de 2016)

La solución de Belisarius es buena.

Para elaborar sobre esa respuesta levemente escueta:

  • /E hace que Robocopy copie recursivamente subdirectorios, incluidos los vacíos.
  • /XC excluye los archivos existentes con la misma marca de tiempo, pero diferentes tamaños de archivo. Robocopy normalmente sobrescribe aquellos.
  • /XN excluye los archivos existentes más nuevos que la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.
  • /XO excluye los archivos existentes anteriores a la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.

Con las clases modificadas, antiguas y nuevas excluidas, Robocopy hace exactamente lo que desea el póster original, sin necesidad de cargar un entorno de scripting.

Puedes intentar esto:

 echo n | copy /-y   

-y simplemente solicita antes de sobrescribir y podemos conectar n a todas esas preguntas. Así que esto básicamente sería copiar archivos que no existen. 🙂

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" 

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

 echo nnnnnnnnnnn | xcopy /-y source target 

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

Solo quiero aclarar algo de mis propias pruebas.

@Hydrargyrum escribió:

  • / XN excluye los archivos existentes más nuevos que la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.
  • / XO excluye los archivos existentes anteriores a la copia en el directorio de origen. Robocopy normalmente sobrescribe aquellos.

Esto es realmente al revés. XN hace archivos “eXclude Newer”, pero excluye archivos que son más nuevos que la copia en el directorio de destino . XO hace “eXclude Older”, pero excluye archivos que son más antiguos que la copia en el directorio de destino .

Por supuesto haz tus propias pruebas como siempre.

 robocopy src dst /MIR /XX 

/ XX: eXclude archivos y directorios “eXtra” (presentes en el destino pero no en el origen). Esto evitará cualquier eliminación del destino. (este es el valor predeterminado)

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

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

Recuerde establecer su ruta al exe robocopy. Para ello, haga clic derecho en “mi computadora”> propiedades> avanzado> “Variables de entorno”, luego encuentre la variable del sistema de ruta y agréguela al final: “; C: \ Archivos de progtwig \ Kits de recursos de Windows \ Herramientas” o lo instaló. Asegúrese de dejar las cadenas de variables de ruta que ya están allí y anexe la ruta de acceso adicional.

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

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

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

En consecuencia, / XO excluirá los archivos de FUENTE MAYOR (que es intuitivo), no “más antiguos que la fuente” como se ha afirmado aquí.

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

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

 robocopy   *.* /MIR 

Esto es lo que me ha funcionado. Lo uso para “agregar” archivos a la otra unidad, sin sobreescribir.

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\ 

Haga la prueba antes de la implementación.