Unire le cartelle e sostituire i file utilizzando l'interfaccia della riga di comando


9

Voglio aggiornare alcuni software del forum e mi piacerebbe testare il processo di aggiornamento usando la CLI come possibilità di apprendimento.

Come unire i contenuti di una cartella in un'altra cartella e sostituire i file?

Risposte:


10

Puoi usare rsyncper fare questo:

$ rsync -abviuzP src/ dest/
  • -amodalità archivio; è uguale a -rlptgoD (no -H, -A, -X)
  • -i attiva il formato dettagliato, che mostra più informazioni rispetto al formato predefinito
  • -brende 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 dimensioni

Vorrei 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

Esempio

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 rsyncquando ha incontrato i file preesistenti dest/.

$ find dest/ | grep "~"
dest/dir3/file3~
dest/dir1/file1~
dest/dir5/file5~

Per chiarire il punto sopra: Una volta che sembra OK, è possibile eseguire questo comando per rimuovere i file di backup:> $ find dest / -name "start dot ~" -delete Questo non sembra funzionare per me, mentre:> $ trova dest / -name "start dot star ~" -elimina fatto. Non sono sicuro che si tratti di un errore di battitura o di qualcosa che non è stato impostato alla mia fine!

2

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.

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.