Copia i file senza sovrascriverli


99

Non riesco a trovare un modo sulla riga di comando per dire "copia tutti i file dalla directory A alla directory B, ma se il file esiste già nella directory B, non sovrascriverlo, non importa quale file sia più recente e non chiedermelo. "

Ho eseguito copia, sposta, xcopy e robocopy e il massimo che posso ottenere è che puoi dire a robocopy "copia da A a B, ma non sovrascrivere i file più recenti con file più vecchi", ma per me non funziona . Ho esaminato xxcopy, ma l'ho scartato, poiché non voglio avere una dipendenza di terze parti da un evento post-build di Visual Studio che richiederà ad altri utenti SVN di avere quello strumento installato per eseguire la compilazione.

Voglio aggiungere una riga di comando all'evento di post-compilazione in Visual Studio 2010 in modo che i file generati dai modelli T4 per i nuovi oggetti del modello EF vengano distribuiti alle cartelle del progetto a cui appartengono, ma i file rigenerati per gli oggetti esistenti non sovrascrivere i file di destinazione potenzialmente modificati.

Poiché il modello T4 si rigenera, il file sorgente è sempre più nuovo e non posso utilizzare in modo affidabile l'opzione "newer", non credo.

Uso classi parziali per quegli elementi per i quali posso, ma ci sono altre cose che genero che non possono utilizzare classi parziali (ad es. Generazione di un file EditorTemplate o DisplayTemplate * .ascx predefinito).

Qualcuno ha problemi simili che hanno risolto?


Hai familiarità con cmd.exeil forcomando di? In caso contrario, ti consiglio di eseguirlo for /?e usarlo.
Gabe

Risposte:


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

5
Questo ha funzionato per me, ma ho dovuto usare i simboli del due percento invece di uno mentre lo eseguivo dall'interno di un file batch piuttosto che dalla riga di comando. Ho sostituito le istanze di% F con %% F e le istanze di% ~ nxF con %% ~ nxF.
Owen,

1
Che cosa significa ~nxin %~nxFesattamente significa?
Serge Rogatch,

@stu, dice solo che per ~nxFla variabile Fsi trasforma in un nome di file e un'estensione.
Serge Rogatch

Sì, così efficacemente, dammi il nome del file + l'estensione, senza il percorso - che è ciò di cui hai bisogno per fare il test nella cartella di destinazione e specificare il nome del file di destinazione. Il punto è che% F include il percorso e tu non lo vuoi lì.
Stu

207

Robocopy , o "Robust File Copy", è un comando di replica della directory della riga di comando. È stato disponibile come parte del Windows Resource Kit a partire da Windows NT 4.0 ed è stato introdotto come funzionalità standard di Windows Vista, Windows 7 e Windows Server 2008.

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

Per elaborare (usando le risposte Hydrargyrum, HailGallaxar e Andy Schmidt):

  • /E fa in modo che Robocopy copi ricorsivamente le sottodirectory, comprese quelle vuote.
  • /XCesclude i file esistenti con lo stesso timestamp, ma dimensioni di file diverse. Robocopy normalmente li sovrascrive.
  • /XNesclude i file esistenti più recenti della copia nella directory di destinazione. Robocopy normalmente li sovrascrive.
  • /XOesclude i file esistenti più vecchi della copia nella directory di destinazione. Robocopy normalmente li sovrascrive.

Con le classi Changed, Older e Newer escluse, Robocopy fa esattamente ciò che vuole il poster originale, senza la necessità di caricare un ambiente di scripting.

Riferimenti: Technet , Wikipedia
Download da: collegamento per il download Microsoft (collegamento verificato l'ultima volta il 30 marzo 2016)


Con "escludi" intendi "salta" o "elimina / rimuovi"?
attacco aereo

@Andre Terra: Salta, normalmente. Se stai usando il flag / MIR, potrebbe rimuoverli. Non l'ho provato.
Hydrargyrum

Con / MIR, i file che non esistono nell'origine vengono effettivamente rimossi. Ma quando si usa anche / XN e / XO, i file che esistono in entrambi i posti vengono semplicemente saltati (non sono sicuro che la dimensione sia controllata). Questo è l'ideale per la mia situazione in cui ho bisogno di copiare una versione più recente o precedente della mia applicazione, ma dove i timbri dateModified delle librerie utilizzate dall'applicazione non sono corretti ma i nomi dei file stessi contengono il loro numero di versione.
Henno Vermeulen

È necessario includere /e? E se /sinvece lo usi ? Non voglio un mucchio di sottocartelle vuote.
Arete

48

La soluzione di Belisario è buona.

Per elaborare quella risposta leggermente concisa:

  • /E fa in modo che Robocopy copi ricorsivamente le sottodirectory, comprese quelle vuote.
  • /XCesclude i file esistenti con lo stesso timestamp, ma dimensioni di file diverse. Robocopy normalmente li sovrascrive.
  • /XNesclude i file esistenti più recenti della copia nella directory di origine. Robocopy normalmente li sovrascrive.
  • /XOesclude i file esistenti più vecchi della copia nella directory di origine. Robocopy normalmente li sovrascrive.

Con le classi Changed, Older e Newer escluse, Robocopy fa esattamente ciò che vuole il poster originale, senza la necessità di caricare un ambiente di scripting.


46

Puoi provare questo:

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

-yrichiede semplicemente prima di sovrascrivere e possiamo reindirizzare n a tutte queste domande. Quindi questo in sostanza copierà solo file non esistenti. :)


2
Splendidamente semplice.
Holf

6
perché risponde a tutte le domande quando pipiamo solo una volta?
phuclv

Fantastico, ho scelto questa opzione. Prima di pensare al piping, ho cercato su Google un parametro che pensavo mi mancasse e poi mi sono imbattuto in questa pagina. Provando questa soluzione ho notato che durante il piping, la copia apparentemente abilita il parametro / Y, quindi è per questo che deve essere aggiunto / -Y.
Andrew

2
@phuclv Sembra che presuma copy /-yautomaticamente No quando lo stdin esaurisce l'input. Puoi omettere il primo esplicito n, o incastrarlo < nul, e accade la stessa cosa.
mwfearnley

6

Eccolo sotto forma di file batch:

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

3

Voglio solo chiarire qualcosa dai miei test.

@Hydrargyrum ha scritto:

  • / XN esclude i file esistenti più recenti della copia nella directory di origine. Robocopy normalmente li sovrascrive.
  • / XO esclude i file esistenti più vecchi della copia nella directory di origine. Robocopy normalmente li sovrascrive.

Questo è in realtà al contrario. XN "esclude i file più recenti" ma esclude i file più recenti della copia nella directory di destinazione . XO esegue "eXclude Older", ma esclude i file più vecchi della copia nella directory di destinazione .

Ovviamente fai i tuoi test come sempre.


1
È una risposta alla domanda originale o un commento alla risposta di qualcun altro?
ASGM

1
La risposta di Hydrargyrum che ha +25 voti al momento della scrittura è una risposta alla domanda originale o un commento alla risposta di qualcun altro?
mo.

3

C'è un modo strano per farlo con xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Includi semplicemente tante n quanti sono i file che stai copiando e risponderà a tutte le domande di sovrascrittura.


Per quanto riguarda copy, vedi questa risposta , in particolare il commento @mwfearnley: copy /-yassume automaticamente nuna volta che lo stdin è esaurito, quindi puoi ad esempio echo nsolo una volta e funziona ancora.
rsenna

3
robocopy src dst /MIR /XX

/ XX: esclude file e directory "eXtra" (presenti nella destinazione ma non nell'origine). Ciò impedirà qualsiasi eliminazione dalla destinazione. (questa è l'impostazione predefinita)


1

Robocopy può essere scaricato qui per i sistemi in cui non è già installato. (Cioè Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (non è necessario riavviare per l'installazione)

Ricorda di impostare il percorso per l'exe robocopy. Puoi farlo facendo clic con il pulsante destro del mouse su "mio computer"> proprietà> avanzate> "Variabili d'ambiente", quindi trova la variabile di sistema del percorso e aggiungila alla fine: "; C: \ Programmi \ Windows Resource Kits \ Strumenti" o ovunque tu installato. Assicurati di lasciare le stringhe della variabile di percorso che sono già presenti e aggiungi semplicemente il percorso aggiuntivo.

una volta impostato il percorso, è possibile eseguire il comando suggerito da belisarius. Funziona benissimo.


1

Non mi consente di commentare direttamente i messaggi errati, ma lasciatemi avvertire tutti che la definizione delle opzioni / XN e / XO è INVERTITA rispetto a quanto è stato pubblicato nei messaggi precedenti.

L'opzione Escludi file più vecchi / più recenti è coerente con le informazioni visualizzate nella registrazione di RoboCopy: RoboCopy itererà attraverso la SORGENTE e quindi segnalerà se ogni file nella SORGENTE è "VECCHIO" o "PIÙ NUOVO" del file nella destinazione.

Di conseguenza, / XO escluderà i file OLDER SOURCE (il che è intuitivo), non "più vecchi del sorgente" come è stato affermato qui.

Se si desidera copiare solo file di origine nuovi o modificati, ma evitare di sostituire i file di destinazione più recenti, / XO è l'opzione corretta da utilizzare.


0

Un approccio semplice consiste nell'usare l'opzione / MIR per eseguire il mirroring delle due directory. Fondamentalmente copierà solo i nuovi file nella destinazione. Nel comando successivo sostituisci origine e destinazione con i percorsi delle tue cartelle, lo script cercherà qualsiasi file con qualsiasi estensione.

robocopy <source directory> <destination directory> *.* /MIR

0

Questo è ciò che ha funzionato per me. Lo uso per "aggiungere" file sull'altra unità, senza sovrascritture.

File 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"

Esempio:

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

Eseguire il test prima dell'implementazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.