Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 smile

MicP : oui cette commande marche mais hélas le serveur de destination requiert une identification par mot de passe sad (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.

man find a écrit :

-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 ?

DonutMan75 a écrit :

En fait, j'ai l'impression que find n'autorise pas le place d'arguments additionnels après {} \+ !

Non, il ne l'autorise pas :

https://www.gnu.org/software/findutils/manual/html_mono/find.html#Multiple-Files a écrit :

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 smile
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
man find (chez moi) a écrit :

       -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.

https://www.gnu.org/software/findutils/manual/html_mono/find.html a écrit :

This is edition 4.7.0, for find version 4.7.0.

Je peux passer le fil en résolu donc smile

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
man find a écrit :

       -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. smile

[/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