Soluzione 1:
Userei rsync in quanto significa che se viene interrotto per qualsiasi motivo, puoi riavviarlo facilmente con un costo minimo. Ed essendo rsync, può anche riavviarsi a metà di un file di grandi dimensioni. Come altri menzionano, può escludere facilmente i file. Il modo più semplice per preservare la maggior parte delle cose è usare il -a
flag – ‘archivio’. Quindi:
rsync -a source dest
Sebbene UID/GID e collegamenti simbolici siano preservati da -a
(vedi -lpgo
), la tua domanda implica che potresti desiderare un completo copia delle informazioni sul filesystem; e -a
non include collegamenti fisici, attributi estesi o ACL (su Linux) o quanto sopra né fork delle risorse (su OS X.) Pertanto, per una copia affidabile di un filesystem, dovrai includere questi flag:
rsync -aHAX source dest # Linux
rsync -aHE source dest # OS X
Il cp predefinito ricomincerà, anche se il -u
il flag "copia solo quando il file SOURCE è più recente del file di destinazione o quando il file di destinazione è mancante" . E il -a
Il flag (archivio) sarà ricorsivo, non ricopia i file se è necessario riavviare e conservare le autorizzazioni. Quindi:
cp -au source dest
Soluzione 2:
Quando eseguo la copia nel file system locale, tendo a utilizzare rsync con le seguenti opzioni:
# rsync -avhW --no-compress --progress /src/ /dst/
Ecco il mio ragionamento:
-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)
Ho visto trasferimenti più veloci del 17% utilizzando le impostazioni rsync di cui sopra rispetto al seguente comando tar come suggerito da un'altra risposta:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Soluzione 3:
Quando devo copiare una grande quantità di dati, di solito uso una combinazione di tar e rsync. Il primo passo è tararlo, qualcosa del genere:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
Di solito con una grande quantità di file, ce ne saranno alcuni che tar non può gestire per qualsiasi motivo. O forse il processo verrà interrotto, o se si tratta di una migrazione del filesystem, potresti voler eseguire la copia iniziale prima dell'effettiva fase di migrazione. Ad ogni modo, dopo la copia iniziale, eseguo un passaggio rsync per sincronizzare tutto:
# cd /dst; rsync -avPHSx --delete /src/ .
Nota che la barra finale su /src/
è importante.
Soluzione 4:
rsync
Ecco l'rsync che uso, preferisco cp per i comandi semplici, non questo.
$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/
cpio
Ecco un modo ancora più sicuro, cpio. È veloce quanto tar, forse un po' più veloce.
$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null
tar
Anche questo è positivo e continua in caso di errori di lettura.
$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -
Nota che sono tutti solo per le copie locali.
Soluzione 5:
Questo thread è stato molto utile e poiché c'erano così tante opzioni per ottenere il risultato, ho deciso di confrontarne alcune. Credo che i miei risultati possano essere utili per far capire ad altri cosa ha funzionato più velocemente.
Per spostare 532 Gb di dati distribuiti tra 1.753.200 file abbiamo avuto quei tempi:
rsync
ha impiegato 232 minutitar
ha impiegato 206 minuticpio
ha impiegato 225 minutirsync + parallel
ha impiegato 209 minuti
Nel mio caso ho preferito usare rsync + parallel
. Spero che queste informazioni aiutino più persone a decidere tra queste alternative.
Il benchmark completo è pubblicato qui