GNU/Linux >> Linux Esercitazione >  >> Linux

Copiare localmente un albero di directory di grandi dimensioni? cp o rsync?

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 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 minuti
  • tar ha impiegato 206 minuti
  • cpio ha impiegato 225 minuti
  • rsync + 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


Linux
  1. Filtro Rsync:copiare un solo pattern?

  2. Linux:eliminare in modo efficiente una directory di grandi dimensioni contenente migliaia di file?

  3. Creare una directory di destinazione durante l'estrazione di Tarball?

  4. Rsync sta cambiando le autorizzazioni della directory?

  5. Come gzippare una directory in Linux

Come visualizzare la struttura ad albero delle directory in Linux

Come usare Rsync

Dividere un albero di directory di grandi dimensioni in blocchi di dimensioni specifiche?

Esempi di comandi Linux rsync

Rsync copia la directory corrente con il nome

tar - Rimuove i componenti principali della directory durante l'estrazione