Windows.
Mirroring di una directory

Spesso si vuole fare un backup oppure una copia su un server di una directory. Un esempio è l'uso di wget che ho fatto per il backup del mio sito. Senza installare alcuna applicazione, su Windows esiste l'ottimo comando robocopy. Ecco l'uso minimale:

ROBOCOPY origine destinazione /MIR

Questo comando copierà il contenuto della cartella origine all'interno della cartella destinazione. L'opzione /MIR elimina i file nella cartella di destinazione che non siano presenti anche nella cartella di origine.

Il comando robocopy è ricchissimo di opzioni. Una di queste, fondamentale, è /FFT, che significa FAT File Time. Vi sarà molto utile se andrete a copiare una directory residente su un filesystem NTFS su una directory residente su FAT/EXT2/EXT3. Infatti la precisione nella data che riporta l'ultima modifica in questi filesystem è di 1 o 2 secondi. NTFS invece ha una precisione molto maggiore (granularità minore). Di conseguenza file identici verranno copiati nuovamente solo perché le date varieranno di pochi decimi di secondo. Per ovviare a questo problema è stata creata l'opzione /FFT che fa considerare uguali due file se, a parte tutto il resto, hanno date uguali entro due secondi di errore.

ROBOCOPY origine destinazione /MIR /FFT

Un altro strumento molto utile è il programmino Freeware chiamato Mirror.

Ecco un piccolo script che uso con robocopy.

@echo off
echo Choose an option number:
echo  1. Sync Cu2O db with HOMY
echo  2. Sync Cu2O db with CLAUDIAM
echo.
:choice
setlocal
SET /P choice="Digit a number [1-2] and press Enter. Just Enter to exit: "
if not defined choice (goto :end)
if "%choice%" EQU "1" goto :choice1
if "%choice%" EQU "2" goto :choice2
endlocal

echo "Wrong choice!"
goto :choice

:choice1
  robocopy E:\Biblioteca\Fisica\Semiconduttori\Cu2O \\HOMY\public\francesco_NON_TOCCARE\letteratura_Cu2O /MIR /FFT
  goto :end

:choice2
  robocopy E:\Biblioteca\Fisica\Semiconduttori\Cu2O \\CLAUDIAM\Cu2O\Letteratura /MIR /FFT
  goto :end
        
:end
  set choice = ""
  goto :eof

Guida robocopy

           Sintassi :: ROBOCOPY origine destinazione [file [file]...] [opzioni]

          origine :: directory di origine (unità:\percorso o
                     \\server\condivisione\percorso).
       destinazione :: directory di destinazione (unità:\percorso o
                       \\server\condivisione\percorso).
               file :: file da copiare (nomi/caratteri jolly: l'impostazione
                       predefinita è "*.*").

::
:: Opzioni di copia:
::
                 /S :: copia le sottodirectory non vuote.
                 /E :: copia le sottodirectory, incluse quelle vuote.
             /LEV:n :: copia solo i primi n livelli dell'albero di
                       directory di origine.

Approfondimento: /S non è di default! Quindi in pratica robocopy di default
                 copia solo i file, non scende nelle cartelle.
                 /E è compreso nell'opzione /MIR
                 

                 /Z :: copia i file in modalità di riavvio.
                 /B :: copia i file in modalità di backup.
                /ZB :: usa la modalità di riavvio; in caso di accesso negato
                       usa la modalità di backup.
            /EFSRAW :: copia tutti i file crittografati in modalità RAW EFS.
            
Approfondimento: /Z, /B, ...




    /COPY:flagcopia :: indica gli elementi dei file da copiare
                       (impostazione predefinita /COPY:DAT).
                       (flag copia : D=dati, A=attributi, T=timestamp).
                       (S=protezione=ACL NTFS, O=informazioni proprietario,
                        U=informazioni controllo).

           /DCOPY:T :: copia i timestamp delle directory.
           
Approfondimento: /DCOPY:T di default non c'è. Cioè quando robocopy copia delle
                 directory, queste avranno la data di modifica pari a quella
                 attuale.

               /SEC :: copia i file con protezione (equivale a /COPY:DATS).
           /COPYALL :: copia tutte le informazioni dei file (equivale a
                       /COPY:DATSOU).
            /NOCOPY :: non copia alcuna informazione dei file (utile con
                       /PURGE).

            /SECFIX :: aggiorna la protezione su tutti i file, anche quelli
                       ignorati.
            /TIMFIX :: corregge l'ora di tutti i file, anche quelli ignorati.

             /PURGE :: elimina i file e le directory di destinazione non più
                       esistenti nell'origine.
               /MIR :: esegue il mirroring di un albero di directory
                       (equivale a /E più /PURGE).

               /MOV :: sposta i file (li elimina dall'origine dopo la copia).
              /MOVE :: sposta i file e le directory (li elimina dall'origine
                       dopo la copia).

     /A+:[RASHCNET] :: aggiunge gli attributi specificati ai file copiati.
     /A-:[RASHCNET] :: rimuove gli attributi specificati dai file copiati.

Approfondimento: RASHCNETO significa
                 R – Read only 
                 A – Archive 
                 S – System 
                 H – Hidden
                 C – Compressed 
                 N – Not content indexed
                 E – Encrypted 
                 T – Temporary
                 O - Offline
                                 
                                 
            /CREATE :: crea solo alberi directory e file vuoti.
               /FAT :: crea file di destinazione usando solo nomi FAT 8.3.
               /256 :: disattiva il supporto dei percorsi più lunghi di 256
                       caratteri.

             /MON:n :: monitorizza l'origine; eseguito di nuovo se rileva
                       più di n modifiche.
             /MOT:m :: monitorizza l'origine; eseguito di nuovo dopo m minuti
                       in caso di modifiche.

      /RH:hhmm-hhmm :: ore di esecuzione i cui è possibile avviare nuove
                       copie.
                /PF :: controlla le ore di esecuzione in base al file
                       (non al passaggio).

             /IPG:n :: scarto tra pacchetti (ms), per liberare larghezza
                       di banda su linee lente.

                 /SL:: copia i collegamenti simbolici rispetto alla destinazione.
::
:: Opzioni di selezione dei file:
::
                 /A :: copia solo i file con l'attributo di archivio.
                 /M :: copia solo i file con l'attributo di archivio e lo
                       reimposta.
    /IA:[RASHCNETO] :: include solo i file con gli attributi specificato.
    /XA:[RASHCNETO] :: esclude i file con gli attributi specificati.

 /XF file [file]... :: esclude i file corrispondenti ai nomi, ai percorsi
                       o ai caratteri jolly specificati.
   /XD dir [dir]... :: esclude le directory corrispondenti ai nomi o ai
                       percorsi specificati.

                /XC :: esclude i file con stessa data ma dimensione differente.
                /XN :: esclude i file più recenti.
                /XO :: esclude i file più vecchi.
                /XX :: esclude i file e le directory supplementari.
                /XL :: esclude i file e le directory isolate.
                /IS :: include i file uguali.
                /IT :: include i file variati.
                
Approfondimento: robocopy di default sovrascrive sempre un file se è diverso in
                 data o contenuto rispetto a quello di origine.
                 
                 XC non copia i file che nell'origine sono stati modificati
                 rispetto a quelli di destinazione
                 XN non copia i file la cui data nell'origine è più recente di
                 quella di destinazione
                 XO non copia i file la cui data nell'origine è più vecchia di
                 quella di destinazione
                 XX non prende in considerazione i file e le directory
                 presenti nella destinazione ma non nell'origine. Questo per
                 esempio inibisce il /PURGE (o il /MIR)
                 XL non prende in considerazione i file e le directory
                 presenti nell'origine ma non nella destinazione. In pratica
                 serve ad aggiornare solo i file già presenti nella destinazione
                 IS copia un file anche se è identico tra sorgente e destinazione
                 IT copia i file identici per timestamp, dimensione e nome ma
                 non con gli stessi attributi (normalmente invece se gli
                 attributi sono l'unica differenza allora il file non è copiato)
                 
                 

             /MAX:n :: dimensione massima dei file, esclude i file con
                       dimensione superiore a n byte.
             /MIN:n :: dimensione minima dei file, esclude i file con
                       dimensione inferiore a n byte.

          /MAXAGE:n :: data file massima, esclude i file anteriori alla data
                       o ai giorni indicati da n.
          /MINAGE:n :: data file minima, esclude i file posteriori alla data
                       o ai giorni indicati da n.
          /MAXLAD:n :: data massima di ultimo accesso, esclude i file non
                       utilizzati dalla data indicata da n.
          /MINLAD:n :: data minima di ultimo accesso, esclude i file
                       utilizzati a partire dalla data indicata da n.
                       (Se n < 1900 allora n = n giorni, altrimenti n = data
                       in formato YYYYMMDD).

                /XJ :: esclude i punti di giunzione (inclusi per impostazione
                       predefinita).

               /FFT :: imposta la modalità oraria dei file FAT
                       (granularità di 2 secondi).
               /DST :: compensa le differenze dovute all'ora legale.

               /XJD :: esclude i punti di giunzione per le directory.
               /XJF :: esclude i punti di giunzione per i file.

::
:: Opzioni per i nuovi tentativi:
::
               /R:n :: numero di nuovi tentativi per le copie non riuscite
                       (impostazione predefinita 1 milione).
               /W:n :: tempo di attesa tra tentativi (impostazione
                       predefinita 30 secondi).

               /REG :: salva /R:n e /W:n nel Registro di sistema come
                       impostazioni predefinite.

               /TBD :: attende la definizione dei nomi di condivisione
                       (errore 67).

::
:: Opzioni di registrazione:
::
                 /L :: elenca i file senza copiarli, eliminarli o
                       aggiungere il timestamp.
                 /X :: indica tutti i file supplementari, non solo quelli
                       selezionati.
                 /V :: genera un output dettagliato, inclusi i file ignorati.
                /TS :: include nell'output i timestamp dei file di origine.
                /FP :: include nell'output il percorso completo dei file.
             /BYTES :: stampa le dimensioni in byte.

                /NS :: non registra le dimensioni dei file.
                /NC :: non registra le classi dei file.
               /NFL :: non registra i nomi dei file.
               /NDL :: non registra i nomi delle directory.

                /NP :: non visualizza la percentuale dello stato di copia.
               /ETA :: mostra il tempo stimato di completamento dei file
                       copiati.

          /LOG:file :: invia l'output dello stato nel file specificato
                       (sovrascrive il file esistente).
         /LOG+:file :: invia l'output dello stato nel file specificato (lo
                       aggiunge se il file esiste).

       /UNILOG:file :: invia l'output dello stato nel file specificato
                       come UNICODE (sovrascrive il file esistente).
      /UNILOG+:file :: invia l'output dello stato nel file specificato
                       come UNICODE (lo aggiunge se il file esiste).

               /TEE :: invia l'output alla finestra della console e nel
                       file di registro.

               /NJH :: non visualizza l'intestazione del processo.
               /NJS :: non visualizza il riepilogo del processo.

           /UNICODE :: genera l'output dello stato come UNICODE.

::
:: Opzioni di processo:
::
  /JOB:nomeprocesso :: usa i parametri del file di processo denominato.
 /SAVE:nomeprocesso :: salva il parametri nel file di processo denominato.
              /QUIT :: esce dopo l'elaborazione della riga di comando per
                       visualizzare i parametri.
              /NOSD :: non specifica alcuna directory di origine.
              /NODD :: non specifica alcuna directory di destinazione.
                /IF :: include i file specificati.

Codici di errore

errorlevel 16 : ***FATAL ERROR***
errorlevel 15 : OKCOPY + FAIL + MISMATCHES + XTRA
errorlevel 14 : FAIL + MISMATCHES + XTRA
errorlevel 13 : OKCOPY + FAIL + MISMATCHES
errorlevel 12 : FAIL + MISMATCHES
errorlevel 11 : OKCOPY + FAIL + XTRA
errorlevel 10 : FAIL + XTRA
errorlevel 9  : OKCOPY + FAIL
errorlevel 8  : FAIL
errorlevel 7  : OKCOPY + MISMATCHES + XTRA
errorlevel 6  : MISMATCHES + XTRA
errorlevel 5  : OKCOPY + MISMATCHES
errorlevel 4  : MISMATCHES
errorlevel 3  : OKCOPY + XTRA
errorlevel 2  : XTRA
errorlevel 1  : OKCOPY
errorlevel 0  : No Change