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?

noyau
la source

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

dmourati
la source
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.

Phil Hollenback
la source
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
Tarun
la source
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
mick
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

utilisateur9869932
la source
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 [email protected]  '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 [email protected]  '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 [email protected]  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

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

Anubioz
la source
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 [email protected]:/dest/folder
Franck Dernoncourt
la source
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.

Atthik
la source
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.

Andrei Pokrovsky
la source
2
C'est un non-sens complet. Vous pouvez utiliser un nombre illimité de cas, scpmais NFS n'est pas une option.
Sven