#1 Le 24/03/2020, à 11:05
- DonutMan75
[RESOLU] find et scp en une seule passe ?
Bonjour, je souhaiterais copier un certain nombre de fichiers vers un poste distant à l'aide de find et scp.
Afin que scp ne me redemande pas à chaque fichier le mot de passe du serveur distant, j'ai dans l'idée d'utiliser "\+" au lieu de "\;" comme terminateur de commande.
Or ça ne semble pas fonctionner...
Je souhaiterais construire une commande du style :
$ scp fichier1 fichier2 .... fichierN donut@serveur
Voici mes essais jusqu'à présent sur un exemple minimal.
NB : sur ce cas simplifié, je pourrais me passer de find mais mon pattern de recherche est un peu plus complexe que ça..
$ touch {a,b,c}.txt
$ ls -1
a.txt
b.txt
c.txt
$ find . -name "*txt"
./a.txt
./c.txt
./b.txt
$ find . -name "*txt" -exec echo {} \;
./a.txt
./c.txt
./b.txt
$ find . -name "*txt" -exec echo {} \+
./a.txt ./c.txt ./b.txt
$ find . -name "*txt" -exec echo scp {} donut@serveur \; # <<< MARCHE MAIS LANCE N SCP SUCCESSIFS.....
scp ./a.txt donut@serveur
scp ./c.txt donut@serveur
scp ./b.txt donut@serveur
$ find . -name "*txt" -exec echo scp {} donut@serveur \+ # <<< NE MARCHE PAS
find: paramètre manquant pour « -exec »
Merci d'avance pour vos retours
Donut
---------------------------------------------------------------------------
SOLUTION
Selon le man de find (uniquement en 4.7.0) le '{}' doit impérativement être placé juste avant le '\+'. Ceci empêche de facto toute construction de commande du genre 'macommande {} autres_arguments \+'
Solutions possibles pour contourner cela (merci à vous tous pour toutes vos suggestions !)
MicP en #2 : scp séquentiel
find . -name "*txt" -exec scp {} donut@serveur:/home/donut/ \;
credenhill en #4 : scp appelle find et non l'inverse
scp $(find . -name "*txt") donut@serveur
DonutMan75 en #5 : on utilise xargs qui propose l'option -I
$ find . -name "*txt" -exec echo {} \+ | xargs -I{} echo scp {} donut@serveur:
Watael en #6 : un peu de sh
find ... -exec sh -c 'scp "$@" login@server:/where/' _ {} +
Dernière modification par DonutMan75 (Le 25/03/2020, à 11:56)
Hors ligne
#2 Le 24/03/2020, à 11:40
- MicP
Re : [RESOLU] find et scp en une seule passe ?
Bonjour
En supposant que tu n'aies aucune identification/mot de passe à donner pour établir la connexion scp
essaye avec :
find . -name "*txt" -exec scp {} donut@serveur:/home/donut/ \;
Ou bien, en plus court,
si tu cible le répertoire personnel du compte utilisateur donut sur serveur :
find . -name "*txt" -exec scp {} donut@serveur: \;
Dernière modification par MicP (Le 24/03/2020, à 11:53)
Hors ligne
#3 Le 24/03/2020, à 11:56
- diesel
Re : [RESOLU] find et scp en une seule passe ?
Je n'ai pas la solution, mais je pense que le problème vient du fait que find sépare les différents résultats par un changement de ligne.
Il faudrait (à mon humble avis) remplacer ces changements de ligne par des espaces et ajouter des guillements autours de chaque nom de fichier s'il y a des noms de fichiers avec des espaces.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#4 Le 24/03/2020, à 12:07
- credenhill
Re : [RESOLU] find et scp en une seule passe ?
hello
et avec ?
scp $(find . -name "*txt") donut@serveur
si les fichiers n'ont pas d'espace dans le nom probablement
Dernière modification par credenhill (Le 24/03/2020, à 12:08)
Hors ligne
#5 Le 24/03/2020, à 13:11
- DonutMan75
Re : [RESOLU] find et scp en une seule passe ?
Bonjour à tous,
merci pour vos retours
MicP : oui cette commande marche mais hélas le serveur de destination requiert une identification par mot de passe (bon après, je peux toujours y installer une clef mais j'aimerais vraiment comprendre le fonctionnement de -exec {} \+)
diesel : oui c'est une très bonne remarque, je n'avais pas pensé à ça ! La doc de find indique que find -exec {} \+ fonctionne de la même façon que xargs. Des options existent pour gérer les espaces dans les arguments. Ainsi :
xargs -0 remplace les '\n' par des '\0'
pour find, il faut utiliser l'option '-print0' pour obtenir un résultat similaire.
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than
the number of matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of `{}' is allowed within the command, and (when find is being invoked from a shell) it should be
quoted (for example, '{}') to protect it from interpretation by shells. The command is executed in the starting directory. If any invocation with the `+' form returns a non-zero value as exit status, then find returns a non-zero
exit status. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at all. This variant of -exec always returns true.
credenhill : oui cette commande donne bien le résultat attendu !
En fait, j'ai l'impression que find n'autorise pas le place d'arguments additionnels après {} \+ !
$ find -name "*txt" -exec echo macommande {} \+
macommande ./a.txt ./c.txt ./b.txt
$ find -name "*txt" -exec echo macommande {} autre_option \+
find: paramètre manquant pour « -exec »
xargs propose l'option -I pour gérer ce cas de figure
$ echo "UN" "DEUX" "TROIS" | xargs echo
UN DEUX TROIS
$ echo "UN" "DEUX" "TROIS" | xargs -I{} echo macommande {} autre_option
macommande UN DEUX TROIS autre_option
Pas l'impression que quelque chose de similaire existe avec find ??
Dernière solution (que je ne trouve pas super élégante) :
$ find . -name "*txt" -exec echo {} \+ | xargs -I{} echo scp {} donut@serveur:
scp ./a.txt ./c.txt ./b.txt donut@serveur:
Qu'en dites-vous ?
Donut
Dernière modification par DonutMan75 (Le 24/03/2020, à 13:53)
Hors ligne
#6 Le 24/03/2020, à 13:54
- Watael
Re : [RESOLU] find et scp en une seule passe ?
salut,
find ... -exec sh -c 'scp "$@" login@server:/where/' _ {} +
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 24/03/2020, à 18:25
- kamaris
Re : [RESOLU] find et scp en une seule passe ?
En fait, j'ai l'impression que find n'autorise pas le place d'arguments additionnels après {} \+ !
Non, il ne l'autorise pas :
Only one ‘{}’ is allowed within the command, and it must appear at the end, immediately before the ‘+’.
Hors ligne
#8 Le 25/03/2020, à 11:50
- DonutMan75
Re : [RESOLU] find et scp en une seule passe ?
Bonjour à tous,
merci Watael pour cette nouvelle solution
kamaris : merci pour cette info cruciale ! Mon man n'indique absolument pas cette subtilité !!
Mais j'ai une version moins récente que celle qui est indiqué dans ton lien
$ find --version
find (GNU findutils) 4.6.0.225-235f
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the to‐
tal number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its com‐
mand lines. Only one instance of `{}' is allowed within the command, and (when find is being invoked from a shell) it should be quoted (for example, '{}') to protect it
from interpretation by shells. The command is executed in the starting directory. If any invocation with the `+' form returns a non-zero value as exit status, then
find returns a non-zero exit status. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at all. This
variant of -exec always returns true.
This is edition 4.7.0, for find version 4.7.0.
Je peux passer le fil en résolu donc
Bonne journée à tous !
D.
Hors ligne
#9 Le 25/03/2020, à 14:23
- kamaris
Re : [RESOLU] find et scp en une seule passe ?
J'ai la 4.7.0, et ça ne figure pas non plus dans mon man :
$ find --version
find (GNU findutils) 4.7.0
-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the
total number of invocations of the command will be much less than the number of matched files. The command line is built in much the same way that xargs builds its
command lines. Only one instance of `{}' is allowed within the command, and (when find is being invoked from a shell) it should be quoted (for example, '{}') to pro‐
tect it from interpretation by shells. The command is executed in the starting directory. If any invocation with the `+' form returns a non-zero value as exit sta‐
tus, then find returns a non-zero exit status. If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be run at
all. This variant of -exec always returns true.
Comme quoi la référence reste malheureusement à consulter en ligne.
Hors ligne
#10 Le 25/03/2020, à 14:28
- xubu1957
Re : [RESOLU] find et scp en une seule passe ?
[HS]
Bonjour,
@kamaris
Pour cette discussion > ./viewtopic.php?pid=22243607#p22243607, quel équivalent à ta commande, pour faire afficher le wificheck du forum anglophone ?
Merci d'avance.
[/HS]
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne