[résolu][bash] appeler une variable dans une commande entre quotes ?

appeler une variable dans une commande entre quotes ? [résolu][bash] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 25-11-2012 à 02:09:34    

Salut,
 
question toute bête sans doute mais je ne trouve pas de réponse :
j'ai une commande comme ça dans un script, mais je n'arrive pas à trouver comment affecter la valeur de la variable $img_tag dans la commande exiftool :
 

Code :
  1. img_tag="soleil"
  2. sun_image=`exiftool -if '$keywords =~ /$img_tag/i' -filename -s3 $1/$image`


où $1 est le chemin d'un répertoire et $image le nom d'un fichier image dans ce répertoire (je suis dans une boucle for ici).
 
 
Les simples quotes, nécessaires à exiftool ici, m'embêtent car ils "empêchent" la lecture du contenu de la variable $img_tag... ce qui est ce que je cherche à obtenir, évidemment. Et sans doute pour ne pas compliquer les choses, vous l'aurez remarqué, toute la commande est entre back-quotes....
 
 
Merci.


Message édité par Swiss_Knight le 25-11-2012 à 15:01:06

---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 25-11-2012 à 02:09:34   

Reply

Marsh Posté le 25-11-2012 à 07:06:03    

salut,
 
as-tu essayé des guillemets "
ou un panachage:

Code :
  1. sun_image=$(exiftool -if "$keywords"' =~ '"/$img_tag"'/i' -filename -s3 $1/$image)


je ne trouve pas ce paquet dans les dépôts de squeeze, je ne peux donc pas tester :(
 
ps: il est peut-être plus ergonomique pour toi d'utiliser les back-quotes, mais pour coder (surtout pour imbriquer) c'est pénible.

Reply

Marsh Posté le 25-11-2012 à 14:02:51    

Salut watael,
 
marche pas ta soluce ; toutes les images sont passées à la moulinette, peu importe leur tag.  
 
si tu veux tu peux regarder la doc du -if d'exiftool ici :
http://www.sno.phy.queensu.ca/~phi [...] ml#if_expr
et en remontant d'un niveau dans l'arborescence du site, tu as les liens généraux dont le téléchargement si tu veux (peux?) essayer avec ta distro.


---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 25-11-2012 à 14:43:26    

Code :
  1. exiftool -if '$keywords =~ /'"$img_tag"'/i' -filename -s3 $1/$image

peut-être.
 
et toi ?, tu peux nous faire part de tes autres tentatives ? histoire qu'on retape pas dedans !

Reply

Marsh Posté le 25-11-2012 à 15:00:47    

Ouaip, ça marche comme ça, (j'avais essayé plein de possibilités de quotes/doubles quotes avant, mais j'avais conservé les back quotes en début et fin, j'avais même tenté d'échapper les singles quotes comme ça : '\'' sans succès)
 
donc ceci fonctionne :
 

Code :
  1. for image in `ls $1 | grep -E ".*\.jpe?g" 2>/dev/null`
  2. do 
  3.         sun_image=$(exiftool -if '$keywords =~ /'"$img_tag"'/i' -filename -s3 -q -q $1/$image)
  4.         if [ "${sun_image}" ] ; then           
  5.                 convert $1/$sun_image -resize $rapport "$1/miniatures/$sun_image"
  6.         fi
  7. done


 
j'ai encore dû rajouter -q -q pour éviter des soucis d'exécution lorsque le tag_img n'existe pas : il voulait convertir le chemin $1/ sans nom d'image derrière...
 
Par contre je doute encore de la nécessité de la boucle for mais je ne vois pas bien ce qu'il y aurait à faire...


---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 25-11-2012 à 21:39:43    

encore une fois, je ne peux pas tester, mais je partirais sur du find | while read

Code :
  1. find $1 -maxdepth 1 -type f -regex '.*\.jpe?g' -printf '%H@%f\n' | while IFS="@" read dir file
  2. do
  3.    sun_image=$(exiftool -if '$keywords =~ /'"$img_tag"'/i' -filename -s3 -q -q "$dir/$file" )
  4.    test -n "$sun_image" && convert $dir/$sun_image -resize $rapport "$dir/miniatures/$sun_image"
  5. done

c'est quoi $sun_image ? c'est une image différente de $file ?

Reply

Marsh Posté le 25-11-2012 à 23:15:46    

$sun_img c'est une variable contenant le nom d'un fichier dans lequel la fonction exiftool a trouvé un certain tag ($img_tag). Je n'ai pas de variable $file. -filname est une option d'exiftool.
 
 
----
En gros, ce petit script me permet de passer en revenu l'intégralité des images d'un répertoire (donné en argument lors de l'appel de mon script) dont l'extension est .jpg ou .jpeg, pour lui dire de miniaturiser (ratio donné en argument aussi) seulement les images contenant un certain tag (donné en argument aussi) et de les mettre dans un sous répertoire avec le même nom que les originales.
 
En creusant peut-être à fond avec exiftool il y a peut-être moyen de faire tenir ça en une ligne en renvoyant le résultat à imagemagick avec un pipe, mais je ne retiendrai jamais une commande si longue et ça me permet de m'exercer un peu à faire du bash... Je ne m'y mets jamais sinon. :D
 
Je vais regarder ton idée du find de plus près, je ne sais pas trop ce que IFS signifie ni les %H@%f\n :S


---------------
Hergestellt in der Schweiz.
Reply

Marsh Posté le 26-11-2012 à 02:46:54    

Citation :

il y a peut-être moyen de faire tenir ça en une ligne en renvoyant le résultat à imagemagick avec un pipe

oui, peut-être avec xargs
un truc du style

Code :
  1. exiftool -if '$keywords =~ /'"$img_tag"'/i' -filename -s3 -q -q "$dir/*.jp?g" | xargs -I{} convert $dir/{} -resize $rapport "$dir/miniatures/"

il faut voir comment se comporte exiftool si on lui passe une liste de fichier ($dir/*.jp?g) au lieu d'un seul fichier.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed