Je voudrais diriger la sortie de find dans la liste d'entrée de scp, comment?

10

Je suis un utilisateur Linux novice et j'essaie d'envoyer une longue liste de fichiers d'un ordinateur à un autre. La liste des arguments est trop longue, j'utilise donc find. J'ai cependant du mal à configurer l'expression. Quelqu'un peut-il aider?

Voici ce que je tape normalement pour une courte liste d'arguments.

scp ./* phogan@computer/directory...

Voici, je pense que cela pourrait se traduire par find.

scp find . -name "*" phogan@computer/directory...

Peut-être que je pourrais utiliser des tuyaux? Toutes les suggestions seraient utiles. Merci d'avance.

user13184
la source

Réponses:

16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

Normalement, je «tar» tous les fichiers ensemble dans un énorme blob et n'appelais «scp» qu'une seule fois. Quelque chose comme ça:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • On pourrait jouer avec les paramètres --exclude = ou --include = de tar.
  • Une autre option serait d'utiliser rsync .
akira
la source
si vous utilisez des mots de passe avec ssh / scp, la solution avec find ne demanderait-elle pas un mot de passe sur chaque fichier?
Quack Quichotte
laisse simplement supposer qu'il sait comment utiliser les clés ssh :) le problème avec 1000 questions de mot de passe est également la raison de l'approche tar
akira
15

Vous pouvez le faire avec une seule commande scp.

  • pour les nouvelles versions de scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • pour les anciennes versions:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Assurez-vous d'encapsuler la findcommande entre les guillemets ` et non les guillemets simples ' .

Carlos Rodrigues
la source
Quelle version scp, quelle distribution linux cela? Par exemple, scp dans Ubuntu 14.04 n'a pas cette option.
geekQ
2
Salut, les anciennes versions le supportent, les nouvelles versions supportent une commande plus simple:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues
1
Ne fonctionne pas sur plusieurs fichiers
Amruta
@Amruta use-r
slybloty
@slybloty scp -rest pour la récursivité sur une seule entrée (répertoire), pas pour plusieurs entrées (plusieurs fichiers).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T
la source
oui, il veut une seule commande de toute façon
John T
utile, utilisé avecgrep -l pattern *
Tanj
Ne semble pas fonctionner sur les fichiers contenant des espaces.
Christophe De Troyer
1

je voudrais suggerer

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

Notez que cette solution évite d'avoir les noms de fichiers sur la ligne de commande où ils pourraient être interprétés comme des arguments de ligne de commande.

Une autre chose à surveiller est que les noms de fichiers peuvent contenir des espaces. Cela signifie qu'une boucle for dans bash peut avoir des difficultés avec une liste de noms de fichiers.

Erik Sjölund
la source