SCP può copiare ricorsivamente le directory?


573

Attualmente posso solo copiare un singolo .tarfile. Ma come posso copiare ricorsivamente le directory scp?

Risposte:


937

Sì, usa -r:

scp -rp sourcedirectory user@dest:/path
  • -r significa ricorsivo
  • -p conserva i tempi di modifica, i tempi di accesso e le modalità dal file originale.

Nota: questo crea l' sourcedirectoryinterno, /pathquindi i file saranno in/path/sourcedirectory


9
Tuttavia, tieni presente che ciò non preserverà i collegamenti simbolici.
CpnCrunch,

12
Si noti che -pr(le opzioni in ordine inverso) non copieranno le cartelle, ma piuttosto il loro contenuto nella directory di destinazione (apparentemente, l'ordine delle opzioni è importante).
pms

172

Mentre le risposte precedenti sono tecnicamente corrette, dovresti anche considerare di utilizzare rsyncinvece. rsyncconfronta i dati sui lati di invio e ricezione con un meccanismo diff in modo da non dover inviare nuovamente i dati già inviati in precedenza.

Se hai intenzione di copiare qualcosa su una macchina remota più di una volta, usa rsync. In realtà, è buono da usare rsyncogni volta perché ha più controlli per cose come copiare le autorizzazioni e la proprietà dei file ed escludere determinati file o directory. In generale:

$ rsync -av /local/dir/ server:/remote/dir/

sincronizzerà una directory locale con una directory remota. Se lo esegui una seconda volta e il contenuto della directory locale non è cambiato, nessun dato verrà trasferito, molto più efficiente dell'esecuzione scpe della copia di tutto ogni volta.

Inoltre, rsyncti consente di recuperare molto facilmente da trasferimenti interrotti, a differenza scp.

Infine, le versioni moderne di rsyncdefault funzionano su ssh, quindi se scpfunziona già, rsyncdovrebbe essere praticamente una sostituzione drop-in.


1
Sono d'accordo rsyncè più efficiente. Una cosa che attualmente non scpfa è consentire la copia tra host remoti (almeno senza eseguire il client rsync su uno di essi).
Cedric Knight,

1
-av: v è per verbose, a per archivio ed è una scorciatoia per -rlptgoD che implica collegamenti ricorsivi, preservare date e collegamenti del proprietario dei diritti. Se vuoi solo un uso ricorsivo-r
pdem


11

Opzione di copia ricorsiva '-r' (lettere minuscole)

scp -r

Che confondo con la normale opzione di copia ricorsiva locale '-R' (lettere maiuscole)

cp -R

1
Volevo solo sottolineare la differenza tra cp e scp poiché -r e -R non sono gli stessi. unix.stackexchange.com/questions/18712/…
Tarun

6

Il modo migliore è usare rsync su SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Le mie opzioni preferite sono -Pazvessh --delete:

  • -a: modalità archivio (include molte opzioni comuni predefinite, inclusa la conservazione dei collegamenti simbolici)
  • -z: comprime
  • -v: verbose: mostra i file
  • -P: mostra i progressi come file completati / rimanenti
  • -e ssh: esegui rsync nel protocollo ssh
  • --delete: elimina i file nella destinazione che non sono più nella sorgente

Tutte le versioni rsyncche ho usato userebbero sshdi default, quindi -esshè improbabile che siano necessarie. E la scelta del comando utilizzato per connettersi all'host remoto non è in alcun modo correlata alla copia ricorsiva.
Kasperd,

4

Dopo aver cercato il flag di copia ricorsiva e averlo utilizzato con successo grazie a questo post, vorrei pubblicare solo un suggerimento.

Se il caso è che stai copiando (ricorsivamente) una directory. Forse se i file vengono inviati compressi potresti risparmiare tempo nel trasferimento

Quello che ho fatto alla fine è stato:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Spero che sia di aiuto


l'estensione del file dovrebbe essere .tar.gzo .tgzpoiché il file è un archivio tar con gzip (poiché -zviene utilizzato il flag).
anthonybell,

2

Puoi ricorsivamente copiare una directory in un archivio compresso con questo semplice comando:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Ad esempio, per copiare il contenuto di /var/logda domain.coma ~/logs.tgzsi esegue:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

È inoltre possibile estrarre i file sul sistema di destinazione utilizzando le pipe. Questo comando copiare il contenuto di /var/loga domain.comper ~/destination/logil vostro sistema:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Anche se per eseguire il mirroring di una directory, probabilmente dovresti usare rsync...


1

Se si preferisce passare la password dell'utente come parametro anziché immetterla in modo interattivo, è possibile utilizzare sshpass( sudo apt-get install -y sshpass).

Esempio:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Puoi usare l'opzione -r con il comando scp per copiare ricorsivamente directory su qualsiasi sistema. Se hai bisogno di qualcos'altro, fai riferimento al tutorial sul comando scp . -r opzione sta per operazione ricorsiva nella maggior parte dei comandi di Linux.


Sebbene sia vera, l' -ropzione è già stata suggerita anni fa ed è la risposta accettata.
RalfFriedl,

-3

Un'altra opzione (probabilmente migliore per un uso ripetuto) è l'uso di NFS: controlla nfs-kernel-server e come impostare le condivisioni NFS.


2
Questa è una totale assurdità. Ci sono infiniti casi in cui scpuseresti ma NFS non è un'opzione.
Sven
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.