Il comando da cui partire
rsync -avz src/ user@server:/srv/app/
-acopia le cartelle e mantiene permessi, date e link.-velenca i file trasferiti.-zcomprime durante il trasferimento, il che aiuta con i testi su una connessione lenta e aggiunge poco per i file già compressi.
Eseguilo due volte di fila e la seconda volta non elenca nessun file. Cambia un file ed elenca solo quello.
Per scegliere fra i tre strumenti, vedi scp, SFTP o rsync a confronto.
Lo slash finale
Uno slash alla fine della sorgente cambia il risultato. Con una cartella chiamata site:
| Comando | Risultato sul server |
|---|---|
rsync -a site server:www/ | www/site/index.html |
rsync -a site/ server:www/ | www/index.html |
Uno slash alla fine della destinazione non fa differenza in questo caso.
Porta o chiave diversa
rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/
Funziona anche una voce Host nella tua configurazione SSH, ed è più breve: rsync -avz src/ server:/srv/app/.
File grandi: avanzamento e ripresa
rsync -aP big.bin user@server:/tmp/
-P significa --partial --progress. Senza --partial, rsync rimuove un file che non ha finito. Con l'opzione, il file parziale resta e la volta successiva viene riutilizzato. Abbiamo interrotto a metà un trasferimento da 30 MB. Senza --partial sul server non è rimasto nessun file. Con l'opzione ne sono rimasti circa 4 MB, lo stesso rsync -aP ha terminato il lavoro e i checksum delle due copie coincidevano.
--dry-run e --delete
--delete rimuove dalla destinazione i file che non sono nella sorgente. Fai sempre un'anteprima con --dry-run, o -n:
$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9 speedup is 0.05 (DRY RUN)
Dopo questo il file c'è ancora. Togli -n per farlo davvero.
Tre modi in cui --delete fa danni
- Una sorgente vuota svuota la destinazione. Una prova a vuoto con una cartella
empty/vuota come sorgente prevedeva di cancellare tutto nella destinazione. Se un mount è fallito e la cartella sorgente è vuota, ottieni proprio questo. - Uno slash sbagliato cancella più del previsto. La destinazione viene confrontata con la sorgente come l'hai scritta, quindi con
sitecontrowww/, tutto il resto che c'è inwww/viene cancellato. - Le esclusioni interagiscono. I file esclusi vengono lasciati in pace a meno che tu non aggiunga
--delete-excluded. Nella nostra prova questo ha rimossodebug.logdal server.
Un limite ferma un'esecuzione che cancellerebbe troppo. Termina con codice 25:
$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)
Altre forme utili
| Operazione | Comando |
|---|---|
| Scaricare | rsync -av server:www/ back/ |
| Saltare dei file | rsync -av --exclude='*.log' site/ server:www/ |
| Vedere cosa cambierebbe e perché | rsync -ain site/ server:www/ |
| Creare le cartelle mancanti nella destinazione | rsync -a --mkpath site/ server:a/b/c/ |
Senza --mkpath, una destinazione più profonda di una cartella fallisce con mkdir ... failed: No such file or directory.
Errori
Se rsync non è installato sul server, ottieni messaggi come questi, e la soluzione è installarlo lì:
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)
Una cartella sorgente che non esiste dà change_dir ... failed: No such file or directory e codice di uscita 23.
Su un Mac
Il comando rsync sul Mac che abbiamo usato è openrsync, che dichiara rsync version 2.6.9 compatible. Ha gestito le opzioni di base qui sopra, ma il suo aiuto non include --mkpath né --append-verify. Se ti servono, installa un rsync più recente con Homebrew.
Domande
rsync via SSH richiede rsync sul server?
Sì. rsync gira su entrambi i lati. Se manca sul server ottieni remote command not found (code 127).
Come uso rsync con un'altra porta SSH?
Passa il comando ssh con -e, per esempio rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, oppure imposta la porta in una voce Host di ~/.ssh/config.
Cosa significa la barra finale in rsync?
Sulla sorgente, src/ copia il contenuto della cartella e src copia la cartella stessa. Sulla destinazione non cambia nulla.