Copiar archivos sin sobrescribir


Simplemente no puedo encontrar una manera en la línea de comandos 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, no importa qué archivo es más nuevo, y no me pregunte."

He pasado por copiar, mover, xcopy y robocopy, y lo más cercano que puedo conseguir es que puedes decirle a robocopy "copia A a B, pero no sobrescribas archivos más nuevos con archivos más antiguos", pero eso no funciona para mí. Miré xxcopy, pero lo descarté, ya que no desea 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 comandos al evento post-build 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 sobrescriban potencialmente editados archivos de destino.

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

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 una EditorTemplate o DisplayTemplate por defecto *.archivo ascx).

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

Author: Peter Mortensen, 0000-00-00

12 answers

For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
 31
Author: Stu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-01 19:43:49

Robocopy, o "Robust File Copy", 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 recursivamente, incluyendo las vacías.
  • /XC excluye archivos existentes con la misma marca de tiempo, pero diferente tamaños de archivo. Robocopy normalmente los sobrescribe.
  • /XN excluye los archivos existentes más reciente que la copia en el destino directorio. Robocopy normalmente los sobrescribe.
  • /XO excluye archivos existentes más antiguos que la copia en el destino directorio. Robocopy normalmente los sobrescribe.

Con las clases Cambiadas, Antiguas y Nuevas excluidas, Robocopy hace exactamente lo que original poster quiere-sin necesidad de cargar un entorno de scripting.

Referencias: Technet, Wikipedia
Descargar desde: Enlace de descarga de Microsoft (Enlace verificado por última vez el Mar 30, 2016)

 163
Author: Dr. belisarius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 21:39:05

La solución de Belisario es buena.

Para elaborar esa respuesta un poco concisa:

  • /E hace que Robocopy copie subdirectorios recursivamente, incluyendo las vacías.
  • /XC excluye archivos existentes con la misma marca de tiempo, pero diferente tamaños de archivo. Robocopy normalmente los sobrescribe.
  • /XN excluye los archivos existentes más reciente que la copia en la fuente directorio. Robocopy normalmente los sobrescribe.
  • /XO excluye archivos existentes más antiguos que el copiar en la fuente directorio. Robocopy normalmente los sobrescribe.

Con las clases Cambiadas, Antiguas y Nuevas excluidas, Robocopy hace exactamente lo que el póster original quiere, sin necesidad de cargar un entorno de scripting.

 42
Author: Hydrargyrum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-11 08:19:12

Puedes probar esto:

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

-y simplemente pide antes de sobrescribir y podemos canalizar n a todas esas preguntas. Así que esto en esencia solo copiaría archivos no existentes. :)

 35
Author: sachin11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-02 02:23:49

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"
 5
Author: Gabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-19 21:12:53

Hay una forma 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.

 3
Author: Adam Ruth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-02 19:35:01

Solo quiero aclarar algo de mi propia prueba.

@Hydrargyrum escribió:

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

Esto es en realidad al revés. XN "excluye archivos más nuevos" pero excluye archivos que son más nuevos que la copia en el destino directorio. XO hace "Excluir Más antiguo", pero excluye los archivos que son más antiguos que la copia en el directorio destino.

Por supuesto, haga sus propias pruebas como siempre.

 2
Author: HailGallaxar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-16 13:07:03
robocopy src dst /MIR /XX

/ XX: Excluir archivos" extra " y dirs (presentes en el destino pero no en el origen). Esto evitará cualquier borrado del destino. (este es el valor predeterminado)

 2
Author: be_good_do_good,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-12 16:13:00

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

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

Recuerde establecer su ruta al exe de robocopy. Para ello, haga clic con el botón derecho en" mi equipo "> propiedades > avanzado> "Variables de entorno", luego encuentre la variable path system y agregue esto al final:"; C:\Program Archivos \ Recurso de Windows Kits \ Tools " o donde quiera que lo haya instalado. Asegúrese de dejar las cadenas de variables de ruta que ya están allí y simplemente agregue la ruta adicional.

Una vez establecida la ruta, puede ejecutar el comando que belisarius sugiere. Funciona muy bien.

 1
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-09 15:37:46

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

La opción Excluir archivos antiguos/nuevos es consistente con la información mostrada en el registro de RoboCopy: RoboCopy iterará a través del ORIGEN y luego informará si cada archivo en el ORIGEN es "ANTERIOR " o" MÁS RECIENTE " que el archivo en el destino.

En consecuencia, /XO excluirá archivos de CÓDIGO FUENTE MÁS ANTIGUOS (lo cual es intuitivo), no "más antiguos que el código fuente" como se había 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.

 1
Author: Andy Schmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-08 16:49:23

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 comando siguiente reemplazar origen y destino con las rutas a sus carpetas, el script buscará cualquier archivo con cualquier extensión.

robocopy <source directory> <destination directory> *.* /MIR
 0
Author: Ionut V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-17 10:25:57

Esto es lo que ha funcionado para mí. Uso esto para" agregar " archivos a la otra unidad, sin sobrescribir.

Archivo por lotes: robocopy-missingfiles.mtd

@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.

 0
Author: Ramesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-14 03:07:46