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

Je suis une quiche en scripts shell :-(

10 réponses
Avatar
Dominique
Bonjour,

Tout est dans le titre. J'en ai marre de manipuler mes images une par
une avec ImageMagick. Alors je tente la ligne de commande :

for i in *.jpg; do `convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done

Elle fait ce que je lui demande.

Mais, pourquoi le script me sort-il ces phrases :

bash: img_0560.jpg : commande introuvable
bash: img_0561.jpg : commande introuvable

img_056* sont les noms de mes fichiers d'origine.

Comment faut-il écrire la sortie pour changer le nom du fichier après
traitement ? Pour l'instant, avec $i partout, le fichier d'origine est
écrasé sauf à diriger les images modifiées vers un autre répertoire ~/tmp.

Merci et bonne journée,
--
Dominique
Esto quod es

10 réponses

Avatar
Alain Montfranc
Dominique a écrit
Bonjour,

Tout est dans le titre. J'en ai marre de manipuler mes images une par une
avec ImageMagick. Alors je tente la ligne de commande :

for i in *.jpg; do `convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done

Elle fait ce que je lui demande.

Mais, pourquoi le script me sort-il ces phrases :

bash: img_0560.jpg : commande introuvable
bash: img_0561.jpg : commande introuvable



a cause du backquote

for i in *.jpg; do convert -verbose -geometry 800 -rotate 270 "$i"
/home/normal/Temp/photo/tmp/"$i"; done


img_056* sont les noms de mes fichiers d'origine.

Comment faut-il écrire la sortie pour changer le nom du fichier après
traitement ? Pour l'instant, avec $i partout, le fichier d'origine est écrasé
sauf à diriger les images modifiées vers un autre répertoire ~/tmp.



Normalement convert est de la forme convert input-file [options]
output-file

Donc :

for i in *.jpg; do convert "$i" -verbose -geometry 800 -rotate 270
/home/normal/Temp/photo/tmp/"$i"; done

Devrait marcher, non ?


Merci et bonne journée,


Avatar
Michaël
Dominique a jugé bon de nous dire :
Bonjour,



Bonjour.


for i in *.jpg; do `convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done

Elle fait ce que je lui demande.

Mais, pourquoi le script me sort-il ces phrases :

bash: img_0560.jpg : commande introuvable
bash: img_0561.jpg : commande introuvable



Je crois que c'est à cause des cotes « ` ». Elles servent à exécuter une
commande (ou une série de commandes) et à récupérer le résultat pour
l'affecter à une variable (ou pour l'interpréter). Je ne sais pas si je
m'exprime correctement :)

Bref, enlevez-les donc, ça ira mieux.


img_056* sont les noms de mes fichiers d'origine.

Comment faut-il écrire la sortie pour changer le nom du fichier après
traitement ? Pour l'instant, avec $i partout, le fichier d'origine est
écrasé sauf à diriger les images modifiées vers un autre répertoire ~/tmp.



Il suffit de donner un autre nom au fichier de sortie. Par exemple :

$ for i in *.jpg; do
convert -verbose -geometry 800 -rotate 270 $i $i.new
done

Au final, vous devriez avoir dans le même répertoire, les images
img_*.jpg et les versions transformées img_*.jpg.new

Si vous voulez avoir des noms en img_*.new.jpg, par exemple, vous pouvez
remplacer « $i $i.new » par « $i `basename $i .jpg`.new.jpg » (je crois).


--
MB un troll ? Meuh non ! Un vrai troll est imprévisible :-)
-+- LD in: Guide du Cabaliste Usenet - Contrôle de routine -+-
Avatar
Dominique
Merci pour ces deux réponses. je m'y penche dés que j'ai deux minutes.
Bonne fin de journée,

--
Dominique
Esto quod es
Avatar
Mulan
> Je crois que c'est à cause des cotes « ` ». Elles servent à exécuter une
commande (ou une série de commandes) et à récupérer le résultat pour
l'affecter à une variable (ou pour l'interpréter). Je ne sais pas si je
m'exprime correctement :)



Si si si, en fait il y a une double interprétation de la commande. Donc une
première fois le $i va être transformé en nom de fichier alors qu'il
faudrait que ce soit au 2e passage, car à la fin du 1er on obtient une série
de commandes du type:

do image_résulant_de_la-rotation.jpg

qui n'ont pas de sens et qui causent ce message d'erreur.

Il faut donc bien enlever les "`" afin qu'il n'y ait qu'une seule exécution.

Il existe bien entendu des cas de figure où l'on souhaite faire 2 passages,
et dans ce cas on "protège" la variable de la première interprétation en
l'encadrant: "$i".

Mais il faut aussi un retour à la ligne ou bien un ";" supplémentaire pour
que ça marche, soit:

for i in *.jpg; do
convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done

ou bien:

for i in *.jpg; do; convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done
Avatar
Alain Montfranc
Mulan a écrit

for i in *.jpg; do; convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done



Nan, pas de ";" apres le do
Avatar
Mulan
"Alain Montfranc" a écrit dans le message de news:

Mulan a écrit

for i in *.jpg; do; convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done



Nan, pas de ";" apres le do



Le bourne shell étant quelque chose d'assez susceptible sur l'indentation,
je ne suis pas convaincue qu'il ne faille pas mettre de ";" quand on reste
sur la même ligne.
Je ne suis pas convaincue non plus que ça ne marcherait pas si on le met :-P
(Je n'ai pas unix sous la main pour vérifier)

L'essentiel, c'est que l'une au moins de ces 2 solutions résoudra le
problème de notre demandeur ;-)
Avatar
geo cherchetout
Le 14.12.2008 12:17, *Dominique* a écrit fort à propos :
Bonjour,

Tout est dans le titre. J'en ai marre de manipuler mes images une par
une avec ImageMagick. Alors je tente la ligne de commande :

for i in *.jpg; do `convert -verbose -geometry 800 -rotate 270 $i
/home/normal/Temp/photo/tmp/$i`; done

Elle fait ce que je lui demande.



Bonjour,
Excuse moi de profiter de cette discussion pour ajouter une question
personnelle : Tes images sont carrées ? Je m'étonne que tu ne définisses pas
largeur et hauteur sous la forme « -geometry 800x1200 » par exemple.
Les manuels de convert, mogrify et Imagemagick n'indiquent pas sous quelle
forme on doit donner ces paramètres.
Avatar
Nicolas George
geo cherchetout wrote in message
<49462336$0$959$:
Excuse moi de profiter de cette discussion pour ajouter une question
personnelle : Tes images sont carrées ? Je m'étonne que tu ne définisses pas
largeur et hauteur sous la forme « -geometry 800x1200 » par exemple.
Les manuels de convert, mogrify et Imagemagick n'indiquent pas sous quelle
forme on doit donner ces paramètres.



Le manuel HTML commun aux commandes l'explicite. Si une seule dimension est
donnée, c'est la largeur, et la hauteur est calculée de manière à préserver
le rapport.
Avatar
geo cherchetout
Le 15.12.2008 10:34, *Nicolas George* a écrit fort à propos :

Je m'étonne que tu ne définisses pas largeur et hauteur sous la forme «
-geometry 800x1200 » par exemple. Les manuels de convert, mogrify et
Imagemagick n'indiquent pas sous quelle forme on doit donner ces
paramètres.



Le manuel HTML commun aux commandes l'explicite. Si une seule dimension
est donnée, c'est la largeur, et la hauteur est calculée de manière à
préserver le rapport.



OK, merci, maintenant que tu le dis, je me souviens de l'avoir lu. :-)
Avatar
Erwan David
Nicolas George <nicolas$ écrivait :

geo cherchetout wrote in message
<49462336$0$959$:
Excuse moi de profiter de cette discussion pour ajouter une question
personnelle : Tes images sont carrées ? Je m'étonne que tu ne définisses pas
largeur et hauteur sous la forme « -geometry 800x1200 » par exemple.
Les manuels de convert, mogrify et Imagemagick n'indiquent pas sous quelle
forme on doit donner ces paramètres.



Le manuel HTML commun aux commandes l'explicite. Si une seule dimension est
donnée, c'est la largeur, et la hauteur est calculée de manière à préserver
le rapport.



Moi je préfère donner sous la forme 800x800, puisqu'il garde les
proportions. Une image 4/3 et paysage deviendra donc du 800x600, en
portrait 600x800.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé