Question sur un tube

Fredish Messages postés 373 Statut Membre -  
jisisv Messages postés 3678 Statut Modérateur -
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.

6 réponses

  1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    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
  2. Fredish Messages postés 373 Statut Membre 19
     
    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
    1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
       
      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
    2. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
       
      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
  3. Utilisateur anonyme
     
    n'importe quoi!

    kinder.surprise,
    le maton du matou
    0
  4. Utilisateur anonyme
     
    (((-:

    je déconne (-:

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

    mérsimeussieu (-:

    kinder.surprise,
    le maton du matou
    0
    1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Fredish Messages postés 373 Statut Membre 19
     
    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
    1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
       
      De rien :)

      "Si c'est stupide et que ça marche,
              alors ce n'est pas stupide"
      0
  7. jisisv Messages postés 3678 Statut Modérateur 936
     
    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