[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