Usando rsync per spostare (non copiare) i file tra le directory?


55

Sto usando rsync per copiare i file da un po 'di tempo. La mia comprensione è che rsync è più veloce di cp quando alcuni dei file da trasferire sono già nella directory di destinazione, trasferendo solo la differenza incrementale (cioè i "delta").

Se questo è corretto, ci sarebbe qualche vantaggio nell'usare rsync per spostare il contenuto di una cartella A , per esempio, una cartella B , con B vuota?

La cartella A ha quasi 1 TB di dati (e milioni di file al suo interno). Il trasferimento verrebbe effettuato su una rete locale ( A e B si trovano su diversi filesystem, entrambi montati su un supercomputer, ad esempio A è NFS e B è lucentezza ).

A parte questo, quali flag dovrei usare per chiedere a rsync di spostare (non copiare) i file da A a B (cioè per eliminare A quando il trasferimento è terminato con successo)?


7
Non credo che rsyncpossa sostituire mv. Mi aspetterei mvdi essere più veloce sulla maggior parte dei tipi di file system quando l'origine e la destinazione si trovano all'interno dello stesso file system, perché dovrei rsyncfare una copia in ogni caso e mvprobabilmente potrei cavarmela cambiando alcune voci della directory. La cosa più vicina che riesco a trovare rsync mvè un --remove-source-filescomando, ma questo non rimuove le directory.
jw013,

2
Grazie @ jw013! Giusto per chiarire, i file si trovano su diversi filesystem e il trasferimento verrebbe effettuato su una rete . Sai se ciò renderebbe ancora mvpiù veloce?
Amelio Vazquez-Reina,

1
Bene, mvnon può operare attraverso una rete - dovrebbe fare affidamento su un mount locale (ad esempio NFS). Se il collo di bottiglia è la rete, rsyncprobabilmente sarebbe più veloce di mvperché rsyncpuò fare la compressione.
jw013,

2
A proposito, cpha la -upossibilità di copiare il file sorgente se è più recente del file di destinazione o quando il file di destinazione è mancante
precipita il

Risposte:


69

Puoi passare --remove-source-filesa rsync per spostare i file invece di copiarli.

Ma nel tuo caso, non ha senso usare rsync, poiché la destinazione è vuota. Una pianura mvfarà il lavoro il più velocemente possibile.

Nel tuo caso, ciò che potrebbe fare la differenza nelle prestazioni è la scelta del protocollo di rete, se hai una scelta tra NFS, Samba, sshfs, sftp, rsync su ssh, tar convogliato in ssh, ecc. La velocità relativa di questi metodi dipende sulle dimensioni dei file, la larghezza di banda della rete e del disco e altri fattori, quindi non c'è modo di dare consigli generali, è necessario eseguire i propri benchmark.


6
Solo per ribadire ciò che dice Caleb, se sei preoccupato per la corruzione dovuta ad esempio a una rete instabile, rsync può avere senso, in quanto verifica ogni file che scrive controllando i blocchi mentre li scrive.
Daniel S. Sterling,

5
l' --remove-source-filesunico elimina i file nel sorgente. se vuoi cancellare il nostro sorgente, non dovresti fare un rm -rf (o findtutte le directory e pass -delete) sul sorgente dopo che rsync viene eseguito correttamente?
Trevor Boyd Smith,

1
@ DanielS.Sterling rsync non blocca i checksum dopo averli scritti (usa i checksum per trovare quali parti dei file esistenti sono state aggiornate e devono essere sincronizzate). Puoi fare una seconda sincronizzazione con --checksumper dirlo per verificare i risultati della prima sincronizzazione.
Clément,

19

Poiché --remove-source-filesnon rimuove le directory, eseguo i seguenti comandi per spostare i file su ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* user@external.server:/home/user/backup
find . -type d -empty -delete

Personalmente mi piace la --progressfunzionalità, come faccio questo trasferimento manualmente. Rimuovilo se stai usando uno script. Mi aspetto che rallenti marginalmente i trasferimenti. L' findopzione di eliminazione del comando elimina solo le directory vuote - non utilizzare rm -rf, in quanto potrebbe eliminare le directory non vuote nel caso in cui un file non fosse trasferito. L' -deleteopzione attiva l' -depthopzione in modo che gli alberi di directory vuoti vengano eliminati dal "basso" in alto.


3
-deleteè molto più bello di -exec rmdir {} +ecc.
Lkraav,

1
Vorrei saltare l'asterisco perché e ho solo barre finali / con percorsi se lo faccio localmente. Se usi l'asterisco rsync salterà i file nascosti come .htaccess o .htpasswd (se presente)
Svetoslav Marinov

16

In generale, come ha detto Gilles, non vi è alcun vantaggio nell'utilizzare rsyncper spostare i file quando mvlo stesso lavoro sarà svolto in modo più semplice e non vi è alcun potenziale guadagno di velocità tra i normali file system.

Ci sono tuttavia alcune volte in cui c'è un vantaggio. In particolare, se hai dei dubbi sulla stabilità della sorgente, della destinazione o della macchina che fa il lavoro, l'uso rsyncti dà la possibilità di riprendere. Questo può essere un notevole vantaggio se il trasferimento è molto grande e, diciamo, la tua rete elettrica non è affidabile. L'uso di rsync sarà un modo più stabile per evitare il danneggiamento dei dati in caso di errore e riprendere da dove si era interrotto.


5
Direi che questo è un enorme vantaggio. In effetti, direi che mvè meglio solo se la destinazione e l'origine sono nella stessa partizione, in modo da mvmodificare solo i metadati del file invece di fare una copia.
nomen

2
Una volta che ho bisogno rsyncpiuttosto che mv è quando voglio preservare la struttura delle cartelle (se usi --relative).
Sridhar Sarnobat,

15

ci sarebbe qualche vantaggio nell'usare rsync per spostare il contenuto di una cartella A, per esempio, una cartella B, con B vuota?

Mi sono trovato in una situazione in cui rsync È più veloce di mv semplicemente perché mv non è in grado di gestire il numero di file nella directory. Ho 1,8 milioni di foto da una telecamera di sicurezza che ha funzionato per 20 giorni e il comando mv termina con un errore perché non è possibile allocare risorse.

rsync, tuttavia, sembra gestire tutti i file senza problemi.


1

Se desideri unire ricorsivamente le directory ... sposta una directory in un'altra directory con nomi di directory potenzialmente duplicati , quindi vedi la mia risposta qui su serverfault.com. mvfa un cattivo lavoro quando esistono directory con lo stesso nome e rsynccopia (leggi + scrivi dati completi) ogni file invece di spostarli (leggi e scrivi solo metadati).


0

Non c'è modo di spostare effettivamente i file usando rsync come farebbe il comando mv di Linux. Usando --remove-source-files, essenzialmente si copiano i file nella destinazione e quindi si eliminano i file (eccetto le directory) dall'origine. Questo potrebbe raggiungere il tuo scopo di spostare i file ma NON risparmierai tempo o operazioni di I / O.

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.