[Linux-31] encore un problème bash

jpcas jpcas at free.fr
Dim 6 Avr 19:10:59 CEST 2014


Le 06/04/2014 17:47, jdd a écrit :
> Je suis en train de terminer un script bash cité ici:
> 
> http://dodin.info/wiki/index.php?n=Photo.CharliesPageDevs#sPhoto.CharliesPageDevs_8
> 
> 
> la ligne clé est
> 
>   b="${a%.*}"
> 
> j'ai trouvé ca sur le net pour supprimer l'extension d'un nom de
> fichier, même au cas ou il y a plusieurs "." dans le nom. Ca marche,
> mais la lecture de la page de man de bash ne m'a qu'un peu éclairé sur
> le fonctionnement. Si quelqu'un pouvait m'expliquer ca en langage clair
> :-)) merci :-)

En gros ça permet de supprimer soit le plus grand préfixe "##", soit le
plus petit "#". Et pareil pour le suffixe,le  plus grand "%%" ou le plus
petit "%".

Prenons un exemple :
$ echo "${A}"
chemin/vers/fichier/toto.tsoin.tsoin.txt

Je veux supprimer l'extension .quelquechose :
$ echo "${A%.*}"
chemin/vers/fichier/toto.tsoin.tsoin

Je ne veux garder que la première partie du nom .quelquechose :
$ echo "${A%%.*}"
chemin/vers/fichier/toto

Je veux supprimer la 1èer partie du chemin :
$ echo "${A#*/}"
vers/fichier/toto.tsoin.tsoin.txt

Je ne veux garder que le nom du fichier :
$ echo "${A##*/}"
toto.tsoin.tsoin.txt


Tu as une bonne explication là :
http://wiki.bash-hackers.org/syntax/pe#substring_removal

> 
> mais également un autre problème
> 
> Je voudrais que la première ligne exécutée soit celle de detox:
> 
>  detox -s utf_8 $a
> 
> mais si je le met dans le script, detox change les noms de fichiers
> (c'est son travail). Comment relire le répertoire pour réinitialiser la
> variable a?

Euh... pourquoi ne pas appliquer la commande à tout le répertoire ou du
moins à tous les fichiers correspondant à l'extension ?

> 
> on passe l'extension du fichier en paramètre du script, et bash renvoie
> en ligne de commande l'ensemble des fichiers ayant cette extension.
> 
> je peux faire ca avec trois scripts (un pour detox, un pour convert et
> un troisième pour chainer les deux, mais c'est bien compliqué :-(

Un petit exemple pour illustrer :

Le contenu du répertoire :

$ ls -1 *.txt
lélé olé.txt
mémé et moi.txt
pépé le mocko.txt


Le script légèrement modifié :

$ cat brol.sh
#!/bin/bash

detox -v -s utf_8 *.${1}

for a in *.${1}
do
echo "convert ${a%.*}.txt -resize 128x128 pwg_representative/${a%.*}.jpg"
done


La mise en œuvre :

$ ./brol.sh txt
Scanning: lélé olé.txt
lélé olé.txt -> lele_ole.txt
Scanning: mémé et moi.txt
mémé et moi.txt -> meme_et_moi.txt
Scanning: pépé le mocko.txt
pépé le mocko.txt -> pepe_le_mocko.txt
convert lele_ole.txt -resize 128x128 pwg_representative/lele_ole.jpg
convert meme_et_moi.txt -resize 128x128 pwg_representative/meme_et_moi.jpg
convert pepe_le_mocko.txt -resize 128x128
pwg_representative/pepe_le_mocko.jpg


> 
> merci
De rien.

> jdd

JP




Plus d'informations sur la liste de diffusion Linux-31