2010-07-31 4 views
0

Je ne peux pas sembler capable de convaincre scp de se comporter.Comment scripter scp -r copy?

Pour les données de test

[email protected]:/tmp$ find /tmp/a1/ 
/tmp/a1/ 
/tmp/a1/a2 
/tmp/a1/a2/a3 

En exécutant la commande

[email protected]:/tmp$ scp -r /tmp/a1 domU-12-31-38-00-E2-52.compute-1.internal:/tmp/a1 

Je me attends à la même structure de répertoire créé sur domU-12-31-38-00-E2-52.compute- 1.internal, quel que soit le répertoire/tmp/a1 existant sur l'hôte cible ou non. Au lieu de cela, ce qui crée en fait scp est la structure suivante (si/tmp/a1 existe sur l'hôte cible)

[email protected]:/tmp$ ssh domU-12-31-38-00-E2-52.compute-1.internal find /tmp/a1 
/tmp/a1 
/tmp/a1/a1 
/tmp/a1/a1/a2 
/tmp/a1/a1/a2/a3 

Comment peut-scp être forcé de copier dans le répertoire donné que la racine de l'opération? Plus tard, je voudrais script cette opération afin que le chemin de répertoire donné sur le maître, je peux appeler un script qui répliquera la même structure de répertoire à tous les esclaves. Veuillez noter que le comportement de rsync (au moins de ce que j'ai testé) est le même de cette manière.

Merci, Maxim.

Répondre

2

scp imite le comportement de cp, qui consiste à copier dans le répertoire cible (s'il existe). Il suffit de le copier dans /tmp plutôt que /tmp/a1.

+0

Je ne pense pas que cela fonctionnera dans tous les cas comme un utilitaire de copie générale aux esclaves. Votre suggestion signifie que je devrai trouver le chemin absolu pour un paramètre, puis décider si c'est un répertoire ou pas. Si c'est alors dépouiller un niveau avant de construire la commande scp. N'y a-t-il pas une solution plus simple qui soit "scripting friendlier?" –

+0

Vous pouvez également supprimer un niveau pour les fichiers. Je ne pense pas que cela doive être conditionnel. 'dirname' le fera pour vous. Vous devrez faire attention aux barres obliques à la fin du chemin. –

0

Au lieu d'utiliser $ scp -r /tmp/a1 utiliser ceci: $ scp -r /tmp/a1/* qui copie tous les fichiers sous/tmp/a1, de sorte que votre structure résultante de votre destination sera /tmp/a1/a2/a3 Ou bien, je suggère de faire le répertoire cible simplement "/ tmp /", pas "/ tmp/a1 /", de toute façon fonctionne. Et à propos de rsync, non, ce n'est pas la même chose: **this/** à rsync signifie **this/** en termes de scp ou cp. La barre oblique finale [this/] signifie copier le contenu du dossier. Si vous laissez la barre oblique finale sur, il copiera le répertoire lui-même [si récursif].

J'espère que vous avez trouvé cela utile. :) Matt