Risposte:
Puoi usare rsync
per fare questo:
$ rsync -abviuzP src/ dest/
-a
modalità archivio; è uguale a -rlptgoD (no -H, -A, -X)-i
attiva il formato dettagliato, che mostra più informazioni rispetto al formato predefinito-b
rende rsync i file di backup esistenti in entrambe le cartelle, aggiungendo ~ al vecchio file. Puoi controllare questo suffisso con --suffix .suf-u
fa in modo che rsync transfer salti i file più recenti in dest che in src-z
attiva la compressione, utile quando si trasferiscono file facilmente comprimibili su collegamenti lenti-P
attiva --partial e --progress
--partial
fa in modo che rsync mantenga i file parzialmente trasferiti se il trasferimento viene interrotto--progress
mostra una barra di avanzamento per ogni trasferimento, utile se si trasferiscono file di grandi dimensioniVorrei rilasciare molti di questi interruttori ma questo è solo per iniziare. Probabilmente userei qualcosa del genere:
$ rsync -abuP src/ dest/
Una volta che sembra OK, è possibile eseguire questo comando per rimuovere i file di backup:
$ find dest/ -name "*.~" -delete
Facciamo finta di avere i seguenti dati di esempio.
dati originali
Useremo i seguenti comandi per produrre alcuni dati falsi.
$ seq 10 | xargs -I{} -- mkdir dest/dir{}
$ for i in $(seq 5); do echo "$i" > dest/dir$i/file$i;done
I dati falsi sono i seguenti:
$ tree -DsifvF --noreport dest/
dest
[ 4096 Aug 29 22:21] dest/dir1/
[ 2 Aug 29 22:21] dest/dir1/file1
[ 4096 Aug 29 22:21] dest/dir2/
[ 2 Aug 29 22:21] dest/dir2/file2
[ 4096 Aug 29 22:21] dest/dir3/
[ 2 Aug 29 22:21] dest/dir3/file3
[ 4096 Aug 29 22:21] dest/dir4/
[ 2 Aug 29 22:21] dest/dir4/file4
[ 4096 Aug 29 22:21] dest/dir5/
[ 2 Aug 29 22:21] dest/dir5/file5
nuovi dati
Ora repliceremo i dati originali ( dest/*
-> src/
) e aggiungeremo un paio di file più recenti al mix. Questo simula una "nuova versione.
$ cp -pr dest/* src/
$ mkdir src/dir11
$ for i in 1 3 5 11; do echo "$i$i" > src/dir$i/file$i;done
I dati falsi sono i seguenti:
$ tree -DsifvF --noreport src/
src
[ 4096 Aug 29 22:21] src/dir1/
[ 3 Aug 29 23:00] src/dir1/file1
[ 4096 Aug 29 22:21] src/dir2/
[ 2 Aug 29 22:21] src/dir2/file2
[ 4096 Aug 29 22:21] src/dir3/
[ 3 Aug 29 23:00] src/dir3/file3
[ 4096 Aug 29 22:21] src/dir4/
[ 2 Aug 29 22:21] src/dir4/file4
[ 4096 Aug 29 22:21] src/dir5/
[ 3 Aug 29 23:00] src/dir5/file5
[ 4096 Aug 29 23:00] src/dir11/
[ 5 Aug 29 23:00] src/dir11/file11
unisci src / in dest /
Questo imita il fatto che abbiamo appena installato il nostro nuovo albero software src/
e che vogliamo unirci nella nostra directory preesistente dest/
.
$ rsync -abuP src/ dest/
sending incremental file list
dir1/file1
3 100% 0.00kB/s 0:00:00 (xfer#1, to-check=5/13)
dir11/
dir11/file11
5 100% 4.88kB/s 0:00:00 (xfer#2, to-check=4/13)
dir3/file3
3 100% 2.93kB/s 0:00:00 (xfer#3, to-check=2/13)
dir5/file5
3 100% 2.93kB/s 0:00:00 (xfer#4, to-check=0/13)
sent 416 bytes received 97 bytes 1026.00 bytes/sec
total size is 18 speedup is 0.04
Come puoi vedere sono stati aggiornati i seguenti file, file1, file3, file5 e il dir11 + file11 appena aggiunto.
E come conferma possiamo vedere che i seguenti file di backup sono stati creati da rsync
quando ha incontrato i file preesistenti dest/
.
$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~
Puoi usare cp -r name_of_the_folder / * name_of_the_destination_folder dove l'asterisco (*) sta per tutti i file e -r per la copia ricorsiva.
Puoi anche usare l'opzione -i che ti chiederà se vuoi sovrascrivere i contenuti.