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 jerome (site web personnel) . Évalué à 1.
Sinon, tu peux jeter un coup d'oeil à find / xargs, ça devrait te plaire.
# Pour commencer
Posté par cops91 . Évalué à 0.
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 syntaxerror . Évalué à 2.
... | cut -d: -f1 | tac | cut -c1-9 | tac
# Une seule ligne !
Posté par JJD . Évalué à 2.
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 JJD . Évalué à 2.
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 cops91 . Évalué à 0.
:-)))
# Ou sh :-)) j'ai un doute
Posté par cops91 . Évalué à 0.
[^] # Re: Ou sh :-)) j'ai un doute
Posté par Olivier Jeannet . Évalué à 2.
# Merci bcq je commence à bien comprendre la manipulation c'est trés fort
Posté par cops91 . Évalué à 1.
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 gaaaaaAab . Évalué à 1.
[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 syntaxerror . Évalué à 2.
$ echo abc|rev
cba
désolé ...
[^] # Quelques explications
Posté par JJD . Évalué à 3.
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 cops91 . Évalué à 0.
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 cops91 . Évalué à 0.
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.