Copia ricorsiva / deep directory della riga di comando in Linux?


13

Qual è un buon modo generale per fare una copia di directory ricorsiva / profonda in Linux che funziona nella maggior parte dei casi? Ho usato cose semplici come incantesimi cp -Rabbastanza elaborati cpio. Ci sono punti di forza o di debolezza significativi che ti fanno preferire l'uno all'altro? Quale usi più spesso?

Risposte:


29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Quindi, in risposta alla tua domanda:

cp -a /foo /bar

Copia tutto ricorsivamente dalla directory / foo alla directory / bar preservando i collegamenti simbolici e la modalità "proprietà" "file" e "i timestamp" di file / directory.


Questa è sicuramente una soluzione molto semplice ed elegante. Hai mai riscontrato degli svantaggi di questo approccio? File system distribuiti? Copie estremamente grandi? Hai trovato altre soluzioni come cpio, tar o rsync più efficienti in alcuni casi?
Greg Mattes,

1
A meno che non si verifichi un errore fisico, non ho mai avuto un errore 'cp' locale dalla memoria (ho fatto solo trasferimenti di dimensioni TB) in qualsiasi luogo montato localmente (indipendentemente dal montaggio NFS o Samba). Dai un'occhiata a 'USAGE' nella pagina man di rsync per esempi che troverai istruttivi. Il mio preferito: $ rsync --partial --progress --rsh = ssh --archive --verbose --comprimere foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth

Come ho notato sopra, -a non è strettamente portatile.
Matthew Flaschen,

Beh, so che busybox, GNU e BSD cp sono ok. A parte le scatole Unix legacy non ho mai visto su cosa non funzionerà? In realtà non vedo il punto altrimenti, anche se capisco perfettamente il sentimento di Zoredache di "Sembra sempre che il lavoro sia svolto correttamente, quindi non ho mai cercato di trovare un sostituto".
Gareth,

@gyaresu Per favore, considera di dividere il tuo secondo commento in un'altra risposta in modo che possiamo votare su di esso.
Greg Mattes,

6

Uso un comando come "cd $ srcdir; tar -c. | Tar -C $ destdir -x" il più delle volte. Ma uso anche rsync -a $ src $ dst.

Il più grande punto di forza della soluzione tar è che è quello che dovevo usare su un sistema molti anni fa che non aveva cpio, rsync o un cp che sarebbe stato copiato in modo ricorsivo. Il catrame è praticamente ovunque. È bloccato sulla mia testa perché l'ho usato molto, probabilmente ci sono modi più eleganti. Sembra sempre che il lavoro sia svolto correttamente, quindi non ho mai cercato di trovare un sostituto.


Mi piace molto l'argomento "l'ubiquità del catrame". Sono esperto in vi per ragioni simili anche se preferisco altri ambienti di editing.
Greg Mattes,

-R fa da tempo parte dello standard ( opengroup.org/onlinepubs/009695399/utilities/cp.html ) sebbene non -a.
Matthew Flaschen,

@Matthew Flaschen: Il tuo commento è destinato alla risposta di @ gyaresu?
Greg Mattes,

È anche rilevante per questo, poiché Zoredache ha affermato di aver incontrato un sistema che "non aveva un [...] cp che sarebbe stato copiato in modo ricorsivo". Fondamentalmente, -R -> portatile, -a -> non portatile.
Matthew Flaschen,

1
Questo risale al ~ 95 e il sistema stava eseguendo una versione di Unix di fine anni '80. Non credo -R sia stata un'opzione per cp, ma non ne sono certo. Ho imparato quel bocconcino leggendo l'usenet.
Zoredache,

6

Dai un'occhiata a rsync ... Mi piace perché copi meno dati quando tieni aggiornate due directory ... può anche funzionare in remoto. Nella sua forma più semplice rsync -a / src / dest


Questo è davvero un buon punto. Essenzialmente rsync ha la capacità di calcolare una "directory diff" e trasferire solo ciò che è necessario per sincronizzare le directory. Quindi puoi chiamare ripetutamente qualcosa come rsync -a src / dest per "ricopiare continuamente" le directory in modo ricorsivo (il trailing / on src è necessario per una corretta sincronizzazione) mentre cp -a src / dest non funziona così. Il comando cp renderà una nuova directory src in dest dopo il primo cp. Avresti bisogno di qualcosa come cp -au src / * dest per le copie successive.
Greg Mattes,

L'altra ragione per cui mi piace rsync è che puoi passare il flag -P, che mostra una barra di avanzamento. Ti dà un'idea di quanto tempo impiegherà qualcosa
Rory,

0

rsyncè un ottimo strumento. È il coltellino svizzero per il trasferimento di dati. È uno strumento così semplice e potente. Una volta che inizi a usarlo, rimani agganciato.

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.