| Qui est en ligne ? |
| Il y a : 18 utilisateurs en ligne, consultez le détail |
Forum » Multimédia, jeux et 3D » Convertir des images de manière automatique |
Forum modéré par : Morgoth |
| Même auteur |
|
Score ( voter ) : |
|
| Page : [1] |
| Auteur | Message |
|---|---|
|
|
#0 Message posté le : 24-02-2008 à 12:05:36 |
Jedi Forum : Administrateur Association : Membre fondateur Arrivé(e) le : 08-05-2003 Nombre de messages : 4286 |
Bonjour J'envisage de me créer un petit script qui aurait comme fonction de convertir des fichiers images au format EPS. Je ne vais pas le rendre trop sphistiqué, mais je veux lui faire tester l'existence dans le répertoire courant d'au moins un fichier pour chacun des formats d'origine possibles, et convertir alors si nécessaire. Voici un premier brouillon, à la syntaxe probablement très approximative, mais qui devrait vous permettre de voir à quoi je veux en venir : #!/bin/bash for e in [jJ][pP][gG] [jJ][pP][eE][gG] [tT][iI][fF][fF] [pP][nN][gG] [bB][mM][pP] do if [ - f *$e ] ; then for i in $(ls *$e) do convert $i basename $i[$e].eps done fi done Alors ??? ------------------------------------- Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas. |
|
|
#1 Message posté le : 24-02-2008 à 14:46:47 |
Elfe Forum : Modérateur Association : Membre fondateur Arrivé(e) le : 08-01-2005 Nombre de messages : 3942 |
Voilà chef :
#!/bin/bash
for i in `ls | egrep -i "\.(bmp|jpg|jpeg|tiff)" | tr "\n" " "`
do
if [ -f "$i" ]
then
eps=`echo $i | awk -v IGNORECASE=1 '{gsub(".(jpg|jpeg|bmp|tiff)$",".eps",$1);print $1;}'`
echo "Conversion de $i en $eps..."
convert $i $eps
fi
done
echo "Fait"
La boucle for parcoure les fichiers en matchant les noms avec une expression rationelle. Le if teste si c'est un fichier ou un répertoir. awk sert à construire le nouveau nom de fichier. Puis convert fait tout le boulot. Note qu'il y aurai plusieurs manière de s'y prendre, en particulier pour la boucle. Ceci en est une, qui fonctionne. --Message édité par jblecanard le 24-02-2008 à 14:50:21-- ------------------------------------- C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon - |
|
|
#2 Message posté le : 24-02-2008 à 15:46:20 |
Hobbit Forum : Modérateur Association : Membre actif Arrivé(e) le : 09-04-2006 Nombre de messages : 1956 |
Il y a effectivement toujours plusieurs manières de faire en shell. Jblecanard, dans ton grep, je rajouterais un '$' à la fin, pour ne pas matcher les fichiers du genre "foo.bmp.txt". Ensuite, ton awk est joli mais j'ai découvert récemment une syntaxe qui changé ma vie :
eps=${i%.*}.eps
pouet=abc.def.gh echo ${pouet%.*} # 'abc.def', on en retire le minimum depuis la fin echo ${pouet%%.*} # 'abc', on en retire le maximum depuis la fin echo ${pouet#*.} # 'def.gh', on en retire le minimum depuis le début echo ${pouet##*.} # 'gh', on en retire le maximum depuis le début Vous noterez que c'est du globbing (comme d'habitude en shell) et non des regexp ; le point n'est pas un caractère spécial et l'étoile match n'importe quoi, le point d'interrogation un caractère... édit: à quoi sert le tr ? édit2: j'ai retrouver l'option (nocaseglob) qui permet de faire super simple (vive le Bash) shopt -s nullglob # ceci dit à Bash de ne pas laisser le "*.xxx" s'il ne match rien shopt -s nocaseglob # le globbing devient insensible à la casse ("*.jpg" == "*.JpG") for f in *.jp{,e}g *.tiff *.png *.bmp; do # ou *.{jp{,e}g,png,bmp} [ -f "$f" ] || continue # on saute si ce n'est pas un fichier régulier eps=${f%.*}.eps echo convert "$f" "$eps" # les guillemets peuvent éviter les ennuies done --Message édité par Azollyx le 24-02-2008 à 16:18:31-- ------------------------------------- Azollyx Horaldius [http://www.azollyx.eu/] |
|
|
#3 Message posté le : 24-02-2008 à 18:36:48 |
Jedi Forum : Administrateur Association : Membre fondateur Arrivé(e) le : 08-05-2003 Nombre de messages : 4286 |
OK, merci ------------------------------------- Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas. |
|
|
#4 Message posté le : 24-02-2008 à 19:56:59 |
Elfe Forum : Modérateur Association : Membre fondateur Arrivé(e) le : 08-01-2005 Nombre de messages : 3942 |
Hum Azollyx tu es sûr que for f in *.jp{,e}g *.tiff *.png *.bmp; fonctionne ? J'ai testé et ça marche pas bien : $i prend les valeurs "*.bmp", "*.png" et "*.bmp" au lieu de matcher les fichiers. Mais il matche bien les *.jpg. Par contre, ton *.{jp{,e}g,png,bmp} devrait fonctionner. Mais ça pose le problème de la casse des lettres... D'où l'intérêt de egrep. Sinon, oui pour "$" à la fin du egrep, je l'avais oublié. Je recherchais une syntaxe similaire à la tienne pour éviter le awk mais ne l'avais pas trouvée. ça marche aussi. Meci pour l'astuce Enfin, le tr sert à remplacer les retours à la ligne par des expaces, sinon le for ne fonctionne pas bien. Voilà --Message édité par jblecanard le 24-02-2008 à 19:59:28-- ------------------------------------- C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon - |
|
|
#5 Message posté le : 24-02-2008 à 21:44:13 |
Hobbit Forum : Modérateur Association : Membre actif Arrivé(e) le : 09-04-2006 Nombre de messages : 1956 |
C'est sûr que si tu n'appliques pas les deux options que j'ai activé, ça ne vas pas bien marcher. :P J'ai testé le script dans les cas que tu sembles cité et ça marchait. Pour qu'il ne match pas les fichiers, tu n'aurais pas rajouté des guillemets dans le for par hazard ? Chez moi je n'ai aucun soucis (Bash 3.2.17) :
azollyx@mimi ~ $ cd tmp/ azollyx@mimi ~/tmp $ ls a.jpg b.JPG toto1 Apple Of Glass Blue 1600.bitmap c.bmp toto1.1 Apple Of Glass Blue 1600.bmp d.jpeg toto2 Apple Of Glass Blue 1600.jpg GNOME-SETTINGS_DAEMONS toto2.1 azollyx@mimi ~/tmp $ shopt -s nullglob azollyx@mimi ~/tmp $ shopt -s nocaseglob azollyx@mimi ~/tmp $ for f in *.jp{,e}g *.tiff *.png *.bmp; do # ou *.{jp{,e}g,png,bmp} > [ -f "$f" ] || continue # on saute si ce n'est pas un fichier régulier > eps=${f%.*}.eps > echo convert "$f" "$eps" # les guillemets peuvent éviter les ennuies > done convert a.jpg a.eps convert Apple Of Glass Blue 1600.jpg Apple Of Glass Blue 1600.eps convert b.JPG b.eps convert d.jpeg d.eps convert Apple Of Glass Blue 1600.bmp Apple Of Glass Blue 1600.eps convert c.bmp c.eps (tu noteras qu'il ne fait rien pour les PNG, car il n'y en a pas) Pour éviter le tr, tu devrais plutôt modifier l'IFS (IFS=$'\n') pour n'y mettre que l'\n ; surtout que ça risque de ne pas trop bien marcher si les noms de fichiers contiennent des espaces ou des retours à la ligne (moins courant). C'est pourquoi je préfère tout faire en Bash, il sait très bien gérer ça tout seul. --Message édité par Azollyx le 24-02-2008 à 21:45:51-- ------------------------------------- Azollyx Horaldius [http://www.azollyx.eu/] |
|
|
#6 Message posté le : 24-02-2008 à 21:48:31 |
Elfe Forum : Modérateur Association : Membre fondateur Arrivé(e) le : 08-01-2005 Nombre de messages : 3942 |
Oups j'avais pas calé tes shopts... au temps pour moi ! ------------------------------------- C'est une situation bien inconfortable que d'être assez sensible à la bêtise pour en souffrir et trop intelligent pour s'en indigner. - Gustave Thibon - |
|
|
#7 Message posté le : 25-02-2008 à 18:28:55 |
Jedi Forum : Administrateur Association : Membre fondateur Arrivé(e) le : 08-05-2003 Nombre de messages : 4286 |
OK, je viens de tester la version d'Azollyx : tu avais juste oublié la ligne où on appelle effectivement convert, tu n'avais prévu que l'annonce (echo ...) Cela dit, j'ai quelque lignes d'erreur non fatales entre deux conversions réussies :
convert: UnableToOpenBlob. En tous cas, un grand merci à vous deux convert: UnableToOpenBlob. convert: UnableToOpenBlob. convert: MissingAnImageFilename. convert janv07série3 004.jpg janv07série3 004.eps ------------------------------------- Quand le dernier arbre aura été abattu, et le dernier animal exterminé, les hommes se rendront compte que l'argent ne se mange pas. |
|
|
#8 Message posté le : 25-02-2008 à 19:32:49 |
Hobbit Forum : Modérateur Association : Membre actif Arrivé(e) le : 09-04-2006 Nombre de messages : 1956 |
Oui je n'avais mis qu'un echo pour tester le script. Ceci dit, l'affichage qu'il produit est assez moyen. Une méthode pour améliorer la donne serait de faire :
(set -x; convert "$f" "$eps") (en virant l'echo et la place du vrai convert). Il doit y avoir un moyen de changer le '+' en début de ligne mais je ne sais plus quelle variable c'est.Pour tes warning avec convert, je vais te laisser chercher. Au pire, tu peux toujours le faire taire en redirigeant sa sortie standard (1) ou erreur (2) par un simple ... 1>/dev/null. --Message édité par Azollyx le 25-02-2008 à 19:34:32-- ------------------------------------- Azollyx Horaldius [http://www.azollyx.eu/] |
| Page : [1] |
Forum » Multimédia, jeux et 3D » Convertir des images de manière automatique |
Forum modéré par : Morgoth |
| Même auteur |
|
Score ( voter ) : |
|
- Petit scarabée : 0 pastille, moins de 100 messages
- Scarabée : 0 pastille, plus de 100 messages
- Hobbit : 1 pastille, plus de 1000 messages
- Naboo : 2 pastilles, plus de 2000 messages
- Elfe : 3 pastilles, plus de 3000 messages
- Jedi : 4 pastilles, plus de 4000 messages
- Maître Jedi : 5 pastilles, plus de 5000 messages