Forum Programmation.shell Le tout en une ligne de commmande !!!!! On peut le faire ???

Posté par  .
Étiquettes : aucune
0
10
fév.
2005
Bonjour,

Je souhaite faire une ligne de commande qui me permettrai de faire ceci :

cd /home/cops91/archives && grep "cops91 du 10-02-05" *

me donne par exemple:

archive100218789.tar:"conversation de cops91 du 10-02-05 avec M. Leblanc ......."

je veux donc après faire un :

tar -x archive100218789 && mv archive100218789 ../FILE100218789

Voilà en faite je veux recupérer le non du fichier qui contient mon expression le "détarer" modifier son nom et déplacer.

Vous allez me dire c'est plus simple de faire un script (d'ailleur je devrai savoir l'ecrire). Mais si je le poste c'est qu'il me faut en une seul ligne de cmd que je pourrai copier/coller sur plusieur machine.

Merci

Si quelqu'un à une idée ?

Sinon je continurai cd ............., tar -x * , grep .........., mv .......... tar -a *
  • # ;

    Posté par  (site web personnel) . Évalué à 1.

    ben si tu ne veux pas retourner à la ligne sépare les instructions avec un point virgule ";" (j'ai pas trop compris l'intérêt mais bon).
    Sinon, tu peux jeter un coup d'oeil à find / xargs, ça devrait te plaire.
  • # Pour commencer

    Posté par  . Évalué à 0.

    cd /home/cops91/archives && tar -x * && grep "cops91 du 10-02-05" * | cut -d: -f1 |cut -c 8-16


    ca me donne La fin du non de mon fichier

    Soit 100218789

    Mais autre petite blague mon fichier peut aussi être dans archive s'appeler:

    file100218789

    Donc le cut -c -8-16 ne marche il faudrai le faire compter de la fin !!!

    Puis-je stoker le résultat de la cmd dans une variable temporaire ?

    pour continuer sur un :

    cd /home/cops91/archives && tar -x * && grep "cops91 du 10-02-05" * | cut -d: -f1 |cut -c 8-16 > temp && mv *+"temp$ ../FILE+"temps$"
    • [^] # Re: Pour commencer

      Posté par  . Évalué à 2.

      suffit de prendre le problème par le bon bout ;-)

      ... | cut -d: -f1 | tac | cut -c1-9 | tac



  • # Une seule ligne !

    Posté par  . Évalué à 2.

    Essaie ça : cd /home/cops91/archives && for file in $(grep -l "cops91 du 10-02-05" * ) ; do tar -xf $file && mv $file ../${$file/#archive/FILE} ; done Attention : c'est un code spécifique bash (il faudra certainement des modifs pour le faire fonctionner avec ksh ou zsh). Je n'ai pas testé, mais je pense que l'on n'est pas loin du résulat souhaité.
      JJD
    • [^] # Re: Une seule ligne !

      Posté par  . Évalué à 2.

      La suite ...

      Sous bash, si la variable file contient ton nom de fichier alors
      ${file##+[^0-9]} te renverra ce même nom en ayant supprimé tout les caractères non numériques du début du nom.

      Si file vaut file123456789.tar, alors ${file##+[^0-9]} vaut 123456789.tar.

      Dans l'expression de monprécédent post, tu peux donc mettre :
      mv $file ../FILE${file##+[^0-9]}.

      A+
      JJD
  • # c'est sous ksh !!

    Posté par  . Évalué à 0.

    a tester donc
    :-)))
  • # Ou sh :-)) j'ai un doute

    Posté par  . Évalué à 0.

    ;-|
    • [^] # Re: Ou sh :-)) j'ai un doute

      Posté par  . Évalué à 2.

      Sous Linux, du moins toutes les distribs que j'ai essayées depuis 1998, "sh" est un lien symbolique sur "bash". "Bash" est le shell par défaut sous Linux.
  • # Merci bcq je commence à bien comprendre la manipulation c'est trés fort

    Posté par  . Évalué à 1.

    déja le "grep -l" je connaissais pas Bien un cut en moins.

    Le for file in $ , là c'est génial si je traduis bien ça fait un
    Pour chaque ficher qui contient " titi et toto en balade" fait ....
    Vraiment génial pour faire un même traitement sur tous les fichiers d'un répertoire.

    Par contre le

    Si file vaut file123456789.tar, alors ${file##+[^0-9]} vaut 123456789.tar.

    LA PAS COMPRIS !!!

    que fait le ##

    Si file vaut archive123456789.tar, alors ${file##+[^0-9]} vaut 123456789.tar AUSSI ?
    ou il faut faire un

    ${file##+[^0-9]} || ${archive##+[0-9]}

    Pourquoi un coup tu m'es ${$file et un aurte coup ${file
    Il y a une difference ?


    grand merci à vous & particulièrement à JJD

    Bien vu le tac
    mais chez moi

    maison@localhost archiv]$ cat archive310114650
    CHAT 3
    [maison@localhost archiv]$ tac archive310114650
    CHAT 3
    [maison@localhost archiv]$

    bizarre Non
    • [^] # Re: Merci bcq je commence à bien comprendre la manipulation c'est trés f

      Posté par  . Évalué à 1.

      non, pas bizarre. C'est juste que tu n'as pas encore vu la "génialité" de tac :

      [gab@coquelicot gab]$ cat bla
      1
      2
      3
      [gab@coquelicot gab]$ tac bla
      3
      2
      1

      alors ? toujours pas convaincu ? :)
    • [^] # Re: Merci bcq je commence à bien comprendre la manipulation c'est trés f

      Posté par  . Évalué à 2.

      non, pas bizarre: j'me suis gourré, je voulais dire "rev":

      $ echo abc|rev
      cba

      désolé ...
    • [^] # Quelques explications

      Posté par  . Évalué à 3.

      Je pense que j'ai buggé dans mon premier post : la bonne syntaxe est bien ${file...

      Je précise encore que beaucoup de ces expressions peuvent ne pas fonctionner si on n'utilise pas bash.

      Concernant l'expression ${file##+([^0-9])}, voici les explications :
      - la variable file contient une chaîne composée de lettres et de chiffres.
      - le "##" dit qu'il faut renvoyer la chaine $file à laquelle on aura enlevé la plus longue chaine, placée au début de $file, et correspondant au motif qui suit
      - le motif est +([^0-9]) : c'est une chaine contenant un ou plusieurs (+) caractères NON (^) numériques (0-9)

      Donc si $file vaut archive310114650, ça va renvoyer 310114650. Si $file vaut file310114650, ça renvoit également 310114650.

      Cette expression devrait fonctionner avec ksh, du moins avec pdksh sur mon linux. Sur un AIX avec ksh, je viens de tester ça, qui semble fonctionner :
      ${file##+([a-zA-Z])}
      -> enlève tous les caractères alphabétiques du début.
      ou alors
      ${file##+([!0-9])}
      (semble fonctionner également avec bash : on utilise ! pour la négation au lieu de ^)

      Avec la syntaxe $(<expression>), on récupère la sortie standard de <expression>. Ça doit également marcher avec ksh. La syntaxe "standard" (pour sh) est plutôt `<expression>` (avec des backquotes), mais c'est un peu moins souple...

      MORALITÉ ; les shells ont beaucoup évolué depuis sh, mais en rompant la compatibilité. On peut faire beaucoup de chose avec, mais si on veut quelque chose de portable, il faut faira TRÈS attention et tester sur les différents environnements cibles.

      JJD
  • # test demain

    Posté par  . Évalué à 0.

    Merci encore pour les infos, je vais les tester demain.

    En fait c'est sous Unix

    Et je suis sûr qu'il y a ksh & sh

    Demain je suis en test.

    Je vous donne des infos dimanche si ça marche

    Bon week-end à tous
  • # Super Gain de temps !!!!! Pas de recherche

    Posté par  . Évalué à 0.

    C'est vraiment bien remettre un fichier pour édition devient un jeu d'enfant un Ctrl+C , Alt+TAB, Ctrl+V, ENTER

    Et c'est fait !!!!!!!

    Ca marche trés bien, voici ma cmd finale:


    cd /home/cops91/archives && for file in $(zgrep -l "cops91 du 10-02-05" *|cut -d. -f1) ;do tar -xf $file && mv $file FILE${file##+([a-zA-Z])} && head -1 INTE${file##+([a-zA-Z])}; done

    Notez le | cut -d. -f1 pour supprimer le ".tar" car je ne sais pas comment faire pour le supprimer dans le mv $file FILE${file##+([a-zA-Z])}

    Aurriez-vous trés cher Shelliste un site avec des explication sur les expressions rationnelles ?
    car des trucs comme :

    echo -e "12345 Service d assainissement 3" | sed -e "s/\(^[^\t ]*\)[\t ]\(..*\)[\t ]\([^\t ]*$\)/\1;\2;\3/g"

    ( Vu dans un autre post)

    Bin la vraiment pas compris !!!

    Et de plus il est sûr que j'aurais pû supprimer le ".tar" sans le cut. Mais bon ça marche, Et je vous en remercie tous.

    A Bientôt Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.