2009/4/23 laborde stephane <[email protected]>

> Merci pour vos réponses. Je me doutais qu'il y avais une histoire de
> guillemets. J'avais pas essayé les simple inversés comme ça : `
>
> J'en profite pour poser d'autres questions pour ma culture et mon
> apprentissage du bash...
>
>
> Laurent Menase a écrit :
> > find . -name \*.txt | while read fichier
> > do
> >     fichier2 =${$fichier##*/}
> >     fichier2 =${fichier2%.*}
> > done
>
> Là, je comprends pas... A quoi servent les 2 lignes dans la boucle ? La
> syntaxe m'est un peu opaque pour le coup.
>
> --
> a+
> Stephane.
> _________________________________
> Linux mailing list
> [email protected]
> http://lists.parinux.org/mailman/listinfo/linux
>

Si on décompose :
${fichier##*/}

${fichier : on opère sur la variable fichier
## : on va couper un motif à la gauche de la chaîne, en étant le plus
«gourmand» possible (greedy matching)
* : n'importe quelle chaîne de caractères, même vide (epsilon pour les fans
de théorie des langages)
/ : le caractère /

donc on coupe la chaîne contenue dans fichier jusqu'au dernier / : en gros
on récupère le nom du fichier (avec extension)

(Si on avait mis un seul #, on se serait arrêté au premier /, la plus petite
correspondance possible au motif donné)

De même :

${fichier2 : on opère sur la nouvelle variable fichier2
% : on va couper un motif à droite de la chaîne, en étant le moins gourmand
possible (on s'arrête à la plus petite correspondance)
. : le caractère point
* : n'importe quelle chaîne de caractères, même vide

donc on coupe la chaîne contenue dans fichier2 jusqu'au premier point :
c'est-à-dire qu'on enlève l'extension.

Miklos.
_________________________________
Linux mailing list
[email protected]
http://lists.parinux.org/mailman/listinfo/linux

Répondre à