web-dev-qa-db-fra.com

Copier des fichiers sans écraser

Je n'arrive pas à trouver un moyen de dire "copier tous les fichiers du répertoire A au répertoire B sur la ligne de commande, mais si le fichier existe déjà dans le répertoire B, ne l'écrasez pas, quel que soit le fichier le plus récent." et ne m'invitez pas. "

Je suis passé par copier, déplacer, xcopy et robocopy, et le plus proche que je puisse obtenir est que vous pouvez dire à robocopy "copier A à B, mais ne pas écraser les fichiers les plus récents avec des fichiers plus anciens", mais cela ne fonctionne pas pour moi. . J'ai consulté xxcopy, mais je l'ai jeté, car je ne souhaite pas avoir de dépendance tierce à un événement post-génération de Visual Studio qui nécessitera que d'autres utilisateurs de SVN disposent de cet outil pour effectuer la construction.

Je souhaite ajouter une ligne de commande à l'événement post-génération dans Visual Studio 2010 afin que les fichiers générés à partir des modèles T4 pour new EF Les objets de modèle sont distribués dans les dossiers du projet auxquels ils appartiennent, mais les fichiers régénérés pour les objets existants ne remplacent pas les fichiers de destination potentiellement modifiés.

Depuis que le modèle T4 se régénère, le fichier source est toujours plus récent et je ne peux pas utiliser le commutateur "plus récent" de manière fiable, à mon avis.

J'utilise des classes partielles pour les éléments pour lesquels je peux le faire, mais je génère d'autres éléments qui ne peuvent pas utiliser de classes partielles (par exemple, générer un fichier EditorTemplate ou DisplayTemplate * .ascx par défaut).

Quelqu'un a-t-il des problèmes similaires qu'ils ont résolus?

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

Robocopy , ou "Copie de fichier robuste", est une commande de réplication de répertoire en ligne de commande. Il était disponible dans le Kit de ressources Windows à partir de Windows NT 4.0 et a été introduit en tant que fonctionnalité standard de Windows Vista, Windows 7 et Windows Server 2008.

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

Pour élaborer (en utilisant Hydrargyrum, HailGallaxar et Andy Schmidt répondent):

  • /E permet à Robocopy de copier de manière récursive des sous-répertoires, y compris des vides.
  • /XC exclut les fichiers existants ayant le même horodatage, mais des tailles de fichier différentes. Robocopy les écrase normalement.
  • /XN exclut les fichiers existants plus récents que la copie du répertoire de destination. Robocopy les écrase normalement.
  • /XO exclut les fichiers existants plus anciens que la copie du répertoire de destination. Robocopy les écrase normalement.

À l'exception des classes Changed, Older et Newer, Robocopy fait exactement ce que l'affiche originale veut, sans avoir à charger un environnement de script.

Références: Technet , Wikipedia
Télécharger depuis: Lien de téléchargement Microsoft (Lien vérifié pour la dernière fois le 30 mars 2016)

182
Dr. belisarius

La solution de Belisarius est bonne.

Pour élaborer sur cette réponse légèrement laconique:

  • /E permet à Robocopy de copier de manière récursive des sous-répertoires, y compris des sous-répertoires vides.
  • /XC exclut les fichiers existants ayant le même horodatage, mais des tailles de fichier différentes. Robocopy les écrase normalement.
  • /XN exclut les fichiers existants plus récents que la copie du répertoire source. Robocopy les écrase normalement.
  • /XO exclut les fichiers existants plus anciens que la copie du répertoire source. Robocopy les écrase normalement.

À l'exception des classes Changed, Older et Newer, Robocopy fait exactement ce que l'affiche originale veut, sans avoir à charger un environnement de script.

44
Hydrargyrum

Vous pouvez essayer ceci:

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

-y invite simplement avant de remplacer et nous pouvons répondre à toutes ces questions. Il s’agirait donc essentiellement de copier des fichiers non existants. :)

39
sachin11

Le voici sous forme de fichier batch:

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

Il existe un moyen étrange de faire cela avec xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Incluez simplement autant de n que de fichiers que vous copiez, et cela répondra à toutes les questions écrasées.

3
Adam Ruth
robocopy src dst /MIR /XX

/ XX: eXclude les fichiers et les répertoires "eXtra" (présents dans la destination mais pas dans la source). Cela empêchera toute suppression de la destination. (c'est la valeur par défaut)

3
be_good_do_good

Je veux juste clarifier quelque chose de mes propres tests.

@ Hydrargyrum a écrit:

  • / XN exclut les fichiers existants plus récents que la copie du répertoire source. Robocopy les écrase normalement.
  • / XO exclut les fichiers existants plus anciens que la copie du répertoire source. Robocopy les écrase normalement.

C'est en fait à l'envers. XN crée les fichiers "eXclude Newer" mais exclut les fichiers plus récents que la copie du répertoire destination. XO fait "eXclude Older", mais exclut les fichiers plus anciens que la copie dans le répertoire destination.

Bien sûr, faites vos propres tests comme toujours.

3
HailGallaxar

Robocopy peut être téléchargé ici pour les systèmes sur lesquels il n'est pas déjà installé. (Ie. Windows Server 2003.)

http://www.Microsoft.com/download/fr/details.aspx?displaylang=en&id=17657 (aucun redémarrage requis pour l'installation)

N'oubliez pas de définir votre chemin vers l'exe robocopy. Pour ce faire, vous devez cliquer avec le bouton droit de la souris sur "Mon ordinateur"> Propriétés> Avancé> "Variables d’environnement", puis rechercher la variable système du chemin d’accès et l’ajouter à la fin: "; Kits de ressources C:\Program Files\Windows\Tools" ou ailleurs. installé il. Assurez-vous de laisser les chaînes de variable de chemin qui sont déjà présentes et ajoutez simplement le chemin supplémentaire.

une fois le chemin défini, vous pouvez exécuter la commande proposée par belisarius. Ça marche très bien.

1
Greg

Cela ne me permet pas de commenter directement les messages incorrects - mais laissez-moi simplement avertir tout le monde, que la définition des options/XN et/XO est inversée par rapport à ce qui a été posté dans les messages précédents.

L'option Exclure les fichiers les plus anciens/les plus récents est cohérente avec les informations affichées dans la journalisation de RoboCopy: RoboCopy effectuera une itération dans la SOURCE, puis signalera si chaque fichier de la SOURCE est "PLUS ANCIEN" ou "PLUS RÉCENT" par rapport au fichier de la destination.

Par conséquent,/XO exclura les fichiers OLDER SOURCE (qui sont intuitifs) et non "plus anciens que la source" comme cela avait été revendiqué ici.

Si vous souhaitez copier uniquement les fichiers source nouveaux ou modifiés, mais évitez de remplacer des fichiers de destination plus récents, l'option/XO est l'option appropriée à utiliser.

1
Andy Schmidt

C'est ce qui a fonctionné pour moi. J'utilise ceci pour "ajouter" des fichiers à l'autre disque, sans écraser.

fichier batch: 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"

Exemple:

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

Faites un test avant la mise en œuvre.

0
Ramesh

Une approche simple consisterait à utiliser l'option/MIR, afin de refléter les deux répertoires. Fondamentalement, il ne copie que les nouveaux fichiers vers la destination. Dans la commande suivante, remplacez la source et la destination par les chemins d'accès à vos dossiers, le script recherchera tous les fichiers avec des extensions.

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