Scp peut-il copier des répertoires de manière récursive?


573

Actuellement, je ne peux copier qu'un seul .tarfichier. Mais comment puis-je copier des répertoires de manière récursive scp?

Réponses:


937

Oui, utilisez -r:

scp -rp sourcedirectory user@dest:/path
  • -r signifie récursif
  • -p préserve les temps de modification, les temps d'accès et les modes du fichier d'origine.

Note: Ceci crée l’ sourcedirectoryintérieur /pathdonc les fichiers seront dans/path/sourcedirectory


9
Cependant, gardez à l'esprit que cela ne préservera pas les liens symboliques.
CpnCrunch

12
Notez que -pr(les options dans l'ordre inverse) ne copiera pas les dossiers, mais leur contenu dans le répertoire cible (apparemment, l'ordre des options est important).
Pms le

172

Bien que les réponses précédentes soient techniquement correctes, vous devriez également envisager d'utiliser à la rsyncplace. rsynccompare les données des côtés émetteur et récepteur à un mécanisme de différenciation afin d'éviter de renvoyer les données déjà envoyées.

Si vous allez copier quelque chose sur une machine distante plusieurs fois, utilisez rsync. En fait, il est bon de l'utiliser à rsyncchaque fois, car il comporte plus de contrôles pour la copie des autorisations et de la propriété des fichiers, ainsi que pour l'exclusion de certains fichiers ou répertoires. En général:

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

va synchroniser un répertoire local avec un répertoire distant. Si vous l'exécutez une seconde fois et que le contenu du répertoire local n'a pas changé, aucune donnée ne sera transférée - ce qui est beaucoup plus efficace que d'exécuter scpet de tout copier à chaque fois.

En outre, rsyncvous permet de récupérer des transferts interrompus très facilement, contrairement à scp.

Enfin, les versions modernes de rsyncpar défaut fonctionnent sur ssh, donc si cela scpfonctionne déjà, cela rsyncdevrait plutôt être un remplacement immédiat.


1
Je suis d'accord rsyncest plus efficace. Une chose qu’il ne fait pas actuellement scpest de permettre la copie entre des hôtes distants (au moins sans exécuter le client rsync sur l’un d’eux).
Cedric Knight

1
-av: v est pour verbose, a pour archive et est un raccourci vers -rlptgoD qui implique récursive, conserve les dates et les liens du propriétaire des droits. Si vous voulez seulement une utilisation récursive-r
pdem


11

Option de copie récursive '-r' (minuscule)

scp -r

Ce que je confonds avec l'option de copie récursive locale habituelle '-R' (majuscule)

cp -R

1
Je voulais juste souligner la différence entre cp et scp car -r et -R ne sont pas identiques. unix.stackexchange.com/questions/18712/…
Tarun

6

Le meilleur moyen est d'utiliser rsync sur SSH

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

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

Mes options préférées sont -Pazvessh - Supprimer:

  • -a: mode archive (inclut beaucoup d'options communes par défaut, y compris la préservation des liens symboliques)
  • -z: compresse
  • -v: verbose: affiche les fichiers
  • -P: affiche les progrès en tant que fichiers terminés / fichiers restants
  • -e ssh: faire rsync dans le protocole ssh
  • --delete: supprime les fichiers de la destination qui ne sont plus dans la source

Toutes les versions rsyncque j'ai utilisées utiliseraient sshpar défaut, il -esshest donc peu probable qu'elles soient nécessaires. Et le choix de commande utilisé pour se connecter à l'hôte distant n'a vraiment aucun rapport avec la copie récursive.
Kasperd

4

Après avoir recherché l'indicateur de copie récursive et l'avoir utilisée avec succès grâce à ce message, j'aimerais simplement poster une suggestion.

Si c'est le cas, vous copiez (de manière récursive) un répertoire. Peut-être que si les fichiers sont envoyés compressés, vous pourriez gagner du temps lors du transfert

Ce que j'ai fait à la fin était:

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

J'espère que cela t'aides


L'extension de fichier doit être soit, .tar.gzsoit .tgzpuisque le fichier est une archive tar compressée (car l' -zindicateur est utilisé).
anthonybell

2

Vous pouvez copier récursivement un répertoire dans une archive compressée avec cette commande simple:

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

Par exemple, pour copier le contenu de /var/logde domain.comvers ~/logs.tgzvous, exécutez:

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

Vous pouvez également extraire des fichiers sur le système cible à l'aide de canaux. Cette commande va copier le contenu de /var/logat domain.comsur ~/destination/logsur votre système:

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

Bien que pour mettre en miroir un répertoire, vous devriez probablement utiliser rsync...


1

Si vous préférez passer le mot de passe de l'utilisateur en tant que paramètre plutôt que de le saisir de manière interactive, vous pouvez utiliser sshpass( sudo apt-get install -y sshpass).

Exemple:

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

0

Vous pouvez utiliser l'option -r avec la commande scp pour copier des répertoires de manière récursive sur tout système. Si vous avez besoin d’autre chose, reportez-vous au didacticiel de la commande scp . L'option -r est synonyme d'opération récursive dans la plupart des commandes Linux.


Bien que vrai, l' -roption a déjà été suggérée il y a des années et constitue la réponse acceptée.
RalfFriedl

-3

Une autre option (probablement préférable pour une utilisation répétée) consiste à utiliser NFS - consultez nfs-kernel-server et comment configurer les partages NFS.


2
C'est un non-sens complet. Vous pouvez utiliser un nombre illimité de cas, scpmais NFS n'est pas une option.
Sven
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.