Faire scp toujours écraser ou créer un répertoire

26

J'utilise scp pour copier un répertoire d'un serveur distant vers un nouveau répertoire (IE changeant juste le nom) sur un autre serveur distant comme:

scp -prq server1:dir1 server2:dir2

Cela fonctionne bien si dir2 n'existe pas sur server2, il crée un nouveau répertoire appelé dir2 qui contient tout de dir1 sur server1.

Le problème survient lorsque dir2 existe déjà sur server2 (REMARQUE: je n'ai aucun moyen de le savoir à l'avance ou de faire un retrait sur dir2 sur server2 au préalable) - ce qui se passe est que j'obtiens une copie de dir1, appelée dir1, en dir2.

Je suis sûr qu'il manque quelque chose de basique, mais je n'arrive pas à comprendre.

Toute aide très appréciée!

Cordialement,

Giles

D'accord, j'ai moins de 10 représentants et je ne peux pas attendre 8 heures alors voici ce que j'ai obtenu:

Voici un script qui fonctionne pour moi:

#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null  2>&1

if [ "$?" -ne "0" ]; then
        echo "failed ... trying method 2"
        scp -prq server1:dir1 server2:dir2
fi

exit

Vous ne savez toujours pas comment faire cela en une seule commande ou même si possible.

Bravo @mindthemonkey, parfois simplement obtenir un nouveau point de vue peut aider à montrer la voie.

Giles
la source
vous avez un accès scp mais pas ssh?
Matt
C'est vrai
Giles
Le seul problème est que vous essaierez la deuxième copie en cas d'échec, qui n'est pas nécessairement dir2 inexistant. Peut-être que si vous pouvez trouver un test qui ne fait pratiquement rien (disons copier un répertoire vierge). Ensuite, en fonction de la sortie, exécutez scp1 ou scp2
Matt
Bon point, je garderai cela à l'esprit pour aller de l'avant et republier si je trouve quelque chose.
Giles
Pouvez-vous sftp? puis vérifiez la sortie de a cd dir2.
Matt

Réponses:

34

Utilisez cette syntaxe "dot":

scp -prq server1:dir1/. server2:dir2/

Cela copie le contenu de ce répertoire, plutôt que le répertoire lui-même. Et je pense que c'est plus portable que le *globbing.

chronospoon
la source
2
-p ⇒ "Préserve les temps de modification, les temps d'accès et les modes du fichier d'origine." -r ⇒ "Copier récursivement des répertoires entiers." -q ⇒ "Désactive l'indicateur de progression." Source: computerhope.com/unix/scp.htm
kr85
1
Cela me donne une erreur:scp: error: unexpected filename: .
Andrew Koster
1

Normalement, pour contrôler la création de répertoire, vous devez utiliser une fin /pour impliquer un chemin complet, mais je pense que cela ne permettra pas de créer le répertoire s'il n'existe pas:

scp -prq server1:dir1/* server2:dir2/

Cela pourrait également manquer caché. fichiers en raison de l'expansion * glob (sans certains travaux spécifiques difficiles sur le shell )

Vous pouvez l'aborder différemment avec sshet tar.

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

Mais cela signifie que le trafic passe par votre machine locale.

Mat
la source
scp -prq server1: dir1 / * server2: dir2 /
Giles
@Giles, dites-vous que cela fonctionne?
Matt
1
Bizarrement, j'ai édité ça mais ça s'est perdu - non, ça ne marche pas, si le dir n'existe pas alors scp donne une erreur. De plus, je n'ai pas de ssh disponible dans ce cas particulier (problème avec les droits des utilisateurs). Cela me donne une idée cependant, comme je le fais dans un script, je peux essayer ce qui précède, capturer toute erreur et, en cas d'erreur, essayer la version de base de mon premier post. Merci pour l'aide @mindthemonkey
Giles
1
Il indique «Est un répertoire» lorsque le répertoire de destination n'existe pas pour moi.
Matt
1
Oui, moi aussi, une sorte d'erreur étrange étant donné que le répertoire n'existe pas.
Giles