Question sur un tube

Fermé
Fredish Messages postés 373 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 15 juin 2004 - 20 mars 2004 à 21:05
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 - 21 mars 2004 à 04:49
Bonsoir à tous, j'arrive pas à effectuer une commande qui m'arrangerait bien pour organiser un repertoire. Il faudrait que tous les fichiers qui, par exemple, contiennent la ligne "Formation" aille dans le repertoire "Formation". Donc, j'ai essayé: "grep Formation * | cp -v Formation/"; et evidemment, ca marche pas, puisque la sortie n'est pas bonne, elle ressemble à ça, xfree.html:TITLE="Formation". Comment enlever ce ":TITLE..."? Et ca marcherait? Enfin bon, toute suggestion... merci d'avance.
A voir également:

6 réponses

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
20 mars 2004 à 21:36
Salut... je ne suis pas sur de tout avoir compris...

Tu as un fichier qui contient des ligne du style:
xfree.html:TITLE="Formation"

Ce fichier se trouve dans un repertoir ou se trouve entre autre, le fichier xfree.html, le dossier Formation.

si c'est cela,
grep Formation fic
te renvoie effectivement la ligne comlete.
Pour ne recuperer que le nom du fichier, il faut lui demander le champ 1:
 grep Fromation fic | cut -f1 -d:
à ce moment là, tu auras sur la sortie, quelque chose d'utilisable par cp. (ici: xfree.html)

Ensuite, vu le fonctionnement de CP, un pipe simple n'est pas possible
Tu te retrouverais avec "cp [destination] [fichier]" au lieu de "cp [fichier] [destination]"

il faut que tu fasse appel à la commande "xargs" qui peut fonctionner a la maniere de "find -exec"
 grep Fromation fic | cut -f1 -d:| xargs -l1 -ifile cp file ./Formation/
Pour le detail de xargs:
-l1: ne pas regrouper les ligne, ou plutot, utiliser des groupes de une ligne. (nécéssaire a l'option -i)

-i[str]: remplace la premiere occurrence de "str" (file ici) par l'entrée standard (le resultat du grep | cut) dans la commande suivante.

Pour le reste, un coup d'oeil au man de xargs. :)

Si ce n'est pas ce que tu cerche a faire, je ne vois pas :(
@++
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
PS:
-f1 et -l1
correspondent respectivement à -f 1 (le chiffre) et -l (la lettre) 1 (le chiffre)
0
Fredish Messages postés 373 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 15 juin 2004 19
20 mars 2004 à 22:11
Toujours mon sauveur asevere :)

Le fichier en question est xfree.html, mais il y en a plein d'autre, alors c'est quand même plus pratique de faire ça avec une commande. Quand je tape, "grep Formation *", il me sort nom du fichier puis la ligne où il a trouvé la valeur que je lui ai demandée; celle que j'ai donnée etait la dernière.

Donc, récapitulons; la commande "grep Formation * | cut -f1 -d:" me donne la sortie qui m'interesse; c'est à dire le nom des fichiers seulement, sans la ligne où grep a trouvé "Formation". Mais, c'est vrai que j'avais remarqué que cp n'aimait pas les tubes, il fait des choses bizarres.

Tu me dis que xargs est ce qu'il faut, et c'est là que je cale; j'y comprends rien aux options; "l1" prend chaque ligne et met un blanc(espace) entre? Le man est pas clair, et pareil pour l'option -i, je comprends pas, "les arguments initiaux" du man; et ca "-i(str) remplace la premiere occurence de "str"(file ici) par l'entrée standard dans la commande suivante"; j'y mets quoi? Je suis pas bon en combinaison mathématique, je suis fatigué en plus.

En tout cas, merci de ta préoccupation :)
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
20 mars 2004 à 22:55
Re :)

Bon pas d'affollement... la syntaxe du xargs est assez déroutante au départ, mais c'est un commande trés trés puissante :)

Alors en fait, la premiere partie de ta commande, tout avant xargs en fait, doit te renvoyer un liste du style

xfree.html
autrefichier.htm
encore_un.html
etc.

Donc, tu te retrouve avec un fichier par ligne.

-l1 dit a xargs d'executer la commande qui le suis, (cp) a chaque fois qu'il lit une ligne sur l'entrée standard.

Ici, l'entrée standard de xargs, et le resultat de la partie de la commande se trouvant avant "| wargs"

-istr, indique a xargs de remplacer le mot "str" par ce qu'il vient de lire la premiere fois qu'il le trouve dans la commande suivante.

Ainsi:
xargs -l1 -istr cp str ./Dossier/
xargs -l1 -iSTR cp STR ./Dossier/
sont stictement identiques :)

en gros on pourrait comparrer "str" a une variable en quelque sortes.

metton que:
grep Fromation * | cut -f1 -d:
te donne:

1.html
2.html
3.html

xargs -l1 -ifile cp file ./Formation/
-premiere ligne (1.html)
il met 1.html dans "file" et il execute cp file ./Formation/
ou plutot, cp 1.html ./Formation/

-seconde ligne (2.html)
il met 2.html dans "file" et il execute cp file ./Formation/
ou plutot, cp 2.html ./Formation/

-troisieme ligne (3.html)
il met 3.html dans "file" et il execute cp file ./Formation/
ou plutot, cp 3.html ./Formation/

Ca te parrait plus clair comme ça, ou alors pas du tout ? :p

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
20 mars 2004 à 23:08
Au fait,
Si l'option -inom ne te parais pas assez claire,
il existe un autre forme, qui fonctionne sans soucis dans ton cas

xargs -l1 -i cp {} ./Formation/

avec cette forme, xargs va a chaque passage ( a chaque ligne lue) remplacer {} par la ligne lue elle même.

Voilà.. je ne sais pas si ça te parait plus compréhensible, ou au contraire plus embrouillant. ( dans ce cas là, toutes mes excuses)

Sinon, tout à fait autre chose.
Pet-ere que ce cas ne peut pas pparaitre chez toi, mais si tu as dans un de tes fichiers le mot Formation alors qu'il contient TITLE="cours" par exemple... il va te le mettre quand même dans le dossier Formation :(

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
Utilisateur anonyme
20 mars 2004 à 23:12
n'importe quoi!

kinder.surprise,
le maton du matou
0
Utilisateur anonyme
20 mars 2004 à 23:14
(((-:

je déconne (-:

c'est un beau post bien détaillé et très clair (-:

mérsimeussieu (-:

kinder.surprise,
le maton du matou
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
20 mars 2004 à 23:27
Tékon... j'ai failli aller re-verifier que ça onctionnait bien :)

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Fredish Messages postés 373 Date d'inscription samedi 17 janvier 2004 Statut Membre Dernière intervention 15 juin 2004 19
20 mars 2004 à 23:37
Ca y est, ca a marché. C'est compliqué la première fois, mais quand on sait après, c'est bien pratique. Donc, en fait, la valeur "str" est une valeur aléatoire, si j'ai bien compris, ca pourrait bien être autre chose; effectivement c'est plus pratique avec "{}".

Enfin bon, ca m'a bien aidé, j'avais plus d'une cinquantaine de fichiers à trier parmi une centaine d'autres. Merci :)
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
20 mars 2004 à 23:47
De rien :)

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
21 mars 2004 à 04:49
Et puis il y a le switch -l de grep
for file in $(grep -l "^http" *) ; do cp $file brol ; done

The software said "Requires Windows98, Win2000, or better,
So I installed Unix.
0