Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

boucle avec expression complexe

12 réponses
Avatar
Nicolas Pontoizeau
Salut,

J'ai eu besoin de me faire un petit script qui récupère les inodes des
fichiers dont le noms se finit par jpg ou avi (pour renommer les fichier
de mon appareil photo)

Ceci marche bien :
#!/bin/zsh
for i in `ls -Ai | grep -iE '(jpg$|avi$)' | awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done

Pour plus de fun je ne voulais pas le limiter aux fichiers jpg et avi
mais aussi mov png... J'ai pensé à quelque chose du style :
#!/bin/zsh
FILTRE="(jpg$|avi$)"
for i in `ls -Ai | grep -iE '$FILTRE' awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done

Mais rien à faire... J'ai essayé un peu au pif dans tous les sens en
enlevant des guillemets... J'y arrive pas :(

Je remercie le gourou qui m'aidera à y voir plus clair.

--
Nicolas Pontoizeau - Promo 2005

10 réponses

1 2
Avatar
Christian CAMIER
Nicolas Pontoizeau wrote:
Salut,

J'ai eu besoin de me faire un petit script qui récupère les inodes des
fichiers dont le noms se finit par jpg ou avi (pour renommer les fichier
de mon appareil photo)

Ceci marche bien :
#!/bin/zsh
for i in `ls -Ai | grep -iE '(jpg$|avi$)' | awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done

Pour plus de fun je ne voulais pas le limiter aux fichiers jpg et avi
mais aussi mov png... J'ai pensé à quelque chose du style :
#!/bin/zsh
FILTRE="(jpg$|avi$)"
for i in `ls -Ai | grep -iE '$FILTRE' awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done

Mais rien à faire... J'ai essayé un peu au pif dans tous les sens en
enlevant des guillemets... J'y arrive pas :(

Je remercie le gourou qui m'aidera à y voir plus clair.

Normal, entre doubles quotes, le dolar ($) est interprété. Tentes :

FILTRE='(jpg$|avi$)' # ici des simples quotes
Ca devrait aller un peut mieux

Ce qui donne :
#!/bin/zsh
FILTRE='(jpg$|avi$)'
for i in `ls -Ai | grep -iE '$FILTRE' | awk 'BEGIN {FS=" "} {print $1}'`
do
...
done

Avatar
Pascal Bourguignon
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> writes:

Salut,

J'ai eu besoin de me faire un petit script qui récupère les inodes des
fichiers dont le noms se finit par jpg ou avi (pour renommer les fichier
de mon appareil photo)

Ceci marche bien :
#!/bin/zsh
for i in `ls -Ai | grep -iE '(jpg$|avi$)' | awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done

Pour plus de fun je ne voulais pas le limiter aux fichiers jpg et avi
mais aussi mov png... J'ai pensé à quelque chose du style :
#!/bin/zsh
FILTRE="(jpg$|avi$)"
for i in `ls -Ai | grep -iE '$FILTRE' awk 'BEGIN {FS=" "} {print $1}'`
for i in `ls -Ai | grep -iE "$FILTRE"|awk 'BEGIN {FS=" "} {print $1}'`

^ ^^
do
[plein de chose]
done

Mais rien à faire... J'ai essayé un peu au pif dans tous les sens en
enlevant des guillemets... J'y arrive pas :(

Je remercie le gourou qui m'aidera à y voir plus clair.

--
Nicolas Pontoizeau - Promo 2005


--
__Pascal Bourguignon__ http://www.informatimago.com/
The world will now reboot; don't bother saving your artefacts.

Avatar
Pascal Bourguignon
Christian CAMIER writes:
Normal, entre doubles quotes, le dolar ($) est interprété. Tentes :
FILTRE='(jpg$|avi$)' # ici des simples quotes
Ca devrait aller un peut mieux

Ce qui donne :
#!/bin/zsh
FILTRE='(jpg$|avi$)'
for i in `ls -Ai | grep -iE '$FILTRE' | awk 'BEGIN {FS=" "} {print $1}'`
do


Faudra mélanger nos deux réponses...

--
__Pascal Bourguignon__ http://www.informatimago.com/
The world will now reboot; don't bother saving your artefacts.

Avatar
Nicolas Pontoizeau
Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> writes:
#!/bin/zsh
FILTRE="(jpg$|avi$)"
for i in `ls -Ai | grep -iE '$FILTRE' awk 'BEGIN {FS=" "} {print $1}'`


for i in `ls -Ai | grep -iE "$FILTRE"|awk 'BEGIN {FS=" "} {print $1}'`


ENORME MERCI!

J'ai du mal à maitriser les simples quotes des doubles quote. Pourquoi
faut il transformer les simples en double quotes dans ce cas?

--
Nicolas Pontoizeau - Promo 2005


Avatar
Christian CAMIER
Pascal Bourguignon wrote:
Christian CAMIER writes:

Normal, entre doubles quotes, le dolar ($) est interprété. Tentes :
FILTRE='(jpg$|avi$)' # ici des simples quotes
Ca devrait aller un peut mieux

Ce qui donne :
#!/bin/zsh
FILTRE='(jpg$|avi$)'
for i in `ls -Ai | grep -iE '$FILTRE' | awk 'BEGIN {FS=" "} {print $1}'`
do



Faudra mélanger nos deux réponses...

Oups, n'avais pas vu le simple quote dans le GREP ;(



Avatar
Christian CAMIER
Nicolas Pontoizeau wrote:


ENORME MERCI!

J'ai du mal à maitriser les simples quotes des doubles quote. Pourquoi
faut il transformer les simples en double quotes dans ce cas?



Entre simple quotes ('), le texte est pris tel quel, alors qu'entre
doubles quotes ("), les variables (entre autre) sont interprétées. Exemple :

$ A='ABCDEF'
$ echo "$A"
ABCDEF
$ echo '$A'
$A

De plus, mieux vaut t'habituer à placer tes noms de variables entre
accolades, cela évite des méprises :

$ AB='GHI'
$ echo "$AB"
GHI
$ echo "${A}B"
ABCDEFB

Avatar
Nicolas Pontoizeau
Christian CAMIER writes:
Normal, entre doubles quotes, le dolar ($) est interprété. Tentes :
FILTRE='(jpg$|avi$)' # ici des simples quotes
Ca devrait aller un peut mieux

Ce qui donne :
#!/bin/zsh
FILTRE='(jpg$|avi$)'
for i in `ls -Ai | grep -iE '$FILTRE' | awk 'BEGIN {FS=" "} {print $1}'`
do


Faudra mélanger nos deux réponses...


En effet!
grep -iE (jpg$|avi$) marche pas
grep -iE '(jpg$|avi$)' marche
FILTRE="(jpg$|avi$)"
grep -iE "$FILTRE" marche aussi
FILTRE="'(jpg$|avi$)'"
grep -iE "$FILTRE" marche pas

Je trouve que c'est bizarre quand même. Enfin merci à vous deux pour
votre solution si rapide!

--
Naissez sur ou au dessus des eaux internationnales et votre nationalité sera
la mer ou le ciel. Naissez sur Terre et vous ne serez jamais "terrien". L'Etat
n'est pas compatible avec la poésie, il n'est pas compatible avec mon ethique.
Nicolas Pontoizeau - Promo 2005


Avatar
Stephane Chazelas
2004-12-11, 14:46(+00), Nicolas Pontoizeau:
Salut,

J'ai eu besoin de me faire un petit script qui récupère les inodes des
fichiers dont le noms se finit par jpg ou avi (pour renommer les fichier
de mon appareil photo)

Ceci marche bien :
#!/bin/zsh
for i in `ls -Ai | grep -iE '(jpg$|avi$)' | awk 'BEGIN {FS=" "} {print $1}'`
do
[plein de chose]
done


zmodload zsh/stat
setopt extendglob

extensions='avi|jpg'

for i in *.(#i)($~extensions)(ND); do
stat -L -H st -- $i
print -r "l'inode de $i est $st[inode]"
done

Pas une bonne idee de post-processer l'output de ls.

Voir le GNU find et son -printf aussi.

--
Stephane

Avatar
Stephane Chazelas
2004-12-11, 15:34(+01), Christian CAMIER:
[...]
Normal, entre doubles quotes, le dolar ($) est interprété. Tentes :
FILTRE='(jpg$|avi$)' # ici des simples quotes
[...]


Oui, mais comme $| et $) ne sont pas des noms valides de
variables (encore que ca pourrait changer dans des versions
futures de zsh), ca ne devrait pas poser de probleme.

Par contre, tous les greps n'aiment pas avoir $ ailleurs qu'en
fin d'expression (meme s'ils devraient s'ils etaient POSIX
conformant).

FILTRE='(jpg|avi)$'

est plus portable.

--
Stephane

Avatar
Stephane Chazelas
2004-12-11, 17:34(+00), Stephane Chazelas:
[...]
setopt extendglob


setopt extendEDglob

sorry

--
Stephane

1 2