Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[OFF] Questions script shell (Résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Sun Oct 25, 2009 4:15 pm    Post subject: [OFF] Questions script shell (Résolu) Reply with quote

Salut, je souhaite écrire un petit script en bash me permettant de réduire la qualité de mes photos. J'ai la commande suivante :
Code:
mogrify -adaptive-resize 2500 -quality 70 photo.JPG

Je souhaite appliquer cette commande seulement aux images ayant une certaine dimension. Il faut donc obtenir les dimensions de l'image. J'ai trouvé ceci :
Code:
identify "ma photo.JPG"
ma photo.JPG JPEG 2592x1944 2592x1944+0+0 8-bit DirectClass 2.181mb 0.390u 0:02

Je ne sais pas comment isoler les dimensions (2592x1944) car leur place dans le retour dépend du nom de l'img (espace ou pas espace).

1. Comment obtenir dans une variable la hauteur / largeur d'une img


2. Comment récupérer dans une variable le type mime d'un fichier ?
Pour le moment je récupère l'extension, mais c'est pas très cool.

Merci.


Last edited by jerep6 on Sun Oct 25, 2009 5:21 pm; edited 1 time in total
Back to top
View user's profile Send private message
freezby
Tux's lil' helper
Tux's lil' helper


Joined: 07 Sep 2006
Posts: 103
Location: Angers, France

PostPosted: Sun Oct 25, 2009 4:24 pm    Post subject: Reply with quote

Yop,

Code:
man identify
devrait t'aider je pense :)

EDIT : j'ai rien dit, comme j'ai pas de gentoo pour tester, j'ai pas fait gaffe, je pensais que les options permettaient de sortir spécifiquement les infos mais non :(
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Sun Oct 25, 2009 4:37 pm    Post subject: Reply with quote

J'ai regardé (vite fais je dois l'avouer) le man mais je n'ai rien trouvé de pertinent.
La commande se rapprochant le plus est identify -verbose
Code:
identify -verbose "ma photo.JPG"               
Image: DSC0955 6.JPG                                                     
  Format: JPEG (Joint Photographic Experts Group JFIF format)           
  Class: DirectClass                                                     
  Geometry: 2592x1944+0+0                                               
  Resolution: 72x72
.........


Je ne sais tjs pas comment isoler les dimensions.
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Sun Oct 25, 2009 4:46 pm    Post subject: Reply with quote

Salut,

est-ce que ça serait un bon point de départ pour toi ?
Code:
identify -verbose imgp6975.jpg|grep Geometry|cut -d: -f2


ou encore
Code:
identify -verbose imgp6975.jpg|grep Geometry|awk -F": " '{print $2}'|cut -d+ -f1


EDIT : Pour le type mime : file -i tonfichier
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Sun Oct 25, 2009 4:59 pm    Post subject: Reply with quote

Merci, c'est nickel comme point de départ. Par contre, c'est un peu lent (la faute de l'option -verbose).
Back to top
View user's profile Send private message
freezby
Tux's lil' helper
Tux's lil' helper


Joined: 07 Sep 2006
Posts: 103
Location: Angers, France

PostPosted: Sun Oct 25, 2009 5:09 pm    Post subject: Reply with quote

en farfouillant un peu, il y a une autre méthode :

Code:
identify -format "%h" photo.jpg
renvoie la hauteur de l'image
Code:
identify -format "%w" photo.jpg
renvoie la largeur de l'image
Code:
identify -format "%m" photo.jpg
renvoie le mimetype de l'image
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Sun Oct 25, 2009 5:11 pm    Post subject: Reply with quote

Bon, en fait apres lecture de la manpage il y a quand même moyen d'éviter tout ce bordel ;)

Code:
identify -format "%wx%h" monfichier.jpg


EDIT : Ah, grillé ^^
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Sun Oct 25, 2009 5:16 pm    Post subject: Reply with quote

Vous êtes géniaux. Merci beaucoup.

Une question : pourquoi dans cette commande tu utilises awk et cut alors que l'ont peut faire tous avec awk ?
Code:
identify -verbose imgp6975.jpg|grep Geometry|awk -F": " '{print $2}'|cut -d+ -f1
identify -verbose imgp6975.jpg|grep Geometry|awk -F": " '{print $2}'|awk -F"+" '{print $1}'


Cut présente il un avantage ?


Merci encore.

EDIT : Comment avez vous trouvé les paramètres de l'option format ? Mon man ne les indique pas.
-format "string" output formatted image characteristics
Back to top
View user's profile Send private message
freezby
Tux's lil' helper
Tux's lil' helper


Joined: 07 Sep 2006
Posts: 103
Location: Angers, France

PostPosted: Sun Oct 25, 2009 5:34 pm    Post subject: Reply with quote

Perso, pour la hauteur et la largeur, en voyant des script sur google. Pour le type mime, en testant des lettres :p
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Sun Oct 25, 2009 5:36 pm    Post subject: Reply with quote

Vous aimez compliquer les choses ! :P
Quelques informations sur "$picture":
height=`identify -format "%h" "$picture"`
width=`identify -format "%w" "$picture"`
compression=`identify -format "%C" "$picture"`

Tu as ainsi les trois informations que tu souhaites dans trois variables.
Back to top
View user's profile Send private message
freezby
Tux's lil' helper
Tux's lil' helper


Joined: 07 Sep 2006
Posts: 103
Location: Angers, France

PostPosted: Sun Oct 25, 2009 5:38 pm    Post subject: Reply with quote

Vi, c'est qu'on a indiqué par la suite :p

tiens et pour ta question sur les paramètres jerep, je viens de trouver ça : http://www.imagemagick.org/script/escape.php ;)
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Sun Oct 25, 2009 6:45 pm    Post subject: Reply with quote

Merci à tous.

Maintenant ya plus ka !
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Sun Oct 25, 2009 10:20 pm    Post subject: Reply with quote

pour cut vs. awk, c'est juste que j'avais édité mon message plusieurs fois, au debut yavait cut partout et aussi sed dans un certain cas. Après édition j'ai opté pour une commande avec un séparateur de 2 caractères et pas de sed. cut n'accepte pas les séparateurs de plus d'un caractère, mais awk si, du coup je suis passé à awk pour la commande avec le séparateur de 2 caractères.
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
xaviermiller
Bodhisattva
Bodhisattva


Joined: 23 Jul 2004
Posts: 8708
Location: ~Brussels - Belgique

PostPosted: Mon Oct 26, 2009 11:19 am    Post subject: Reply with quote

Magic Banana wrote:
Vous aimez compliquer les choses ! :P
Quelques informations sur "$picture":
height=`identify -format "%h" "$picture"`
width=`identify -format "%w" "$picture"`
compression=`identify -format "%C" "$picture"`

Tu as ainsi les trois informations que tu souhaites dans trois variables.


Pas mal, mais tu auras 3 traitements identiques par fichier.
_________________
Kind regards,
Xavier Miller
Back to top
View user's profile Send private message
Bapt
Veteran
Veteran


Joined: 14 Apr 2003
Posts: 1152
Location: Paris

PostPosted: Mon Oct 26, 2009 11:37 am    Post subject: Reply with quote

juste pourquoi pas un simple :
Code:
eval `identify -format "height=%h\nwidth=%w\ncompression=%C" monfichier.jpg`


Un seul appel système, pas de pipe et de truc tordus massacreurs de chatons etc.

PS: les | grep | awk vous pouvez les virer avec awk '/regex/ { print bla }' ça sauvera un chaton[/code]
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Mon Oct 26, 2009 12:01 pm    Post subject: Reply with quote

XavierMiller wrote:
Magic Banana wrote:
Vous aimez compliquer les choses ! :P
Quelques informations sur "$picture":
height=`identify -format "%h" "$picture"`
width=`identify -format "%w" "$picture"`
compression=`identify -format "%C" "$picture"`

Tu as ainsi les trois informations que tu souhaites dans trois variables.


Pas mal, mais tu auras 3 traitements identiques par fichier.

Vrai. Bapt a probablement trouvé la façon la plus propre de faire les choses. Une autre façon est d'affecter les paramètres de position :
La hauteur dans $1, la largeur dans $2 et la compression dans $3:
set `identify -format "%h %w %C" "$picture"`

Il n'y a probablement pas plus court... mais c'est un peu casse gueule d'utiliser les paramètres de position à tout va.


Last edited by Magic Banana on Mon Oct 26, 2009 12:30 pm; edited 1 time in total
Back to top
View user's profile Send private message
xaviermiller
Bodhisattva
Bodhisattva


Joined: 23 Jul 2004
Posts: 8708
Location: ~Brussels - Belgique

PostPosted: Mon Oct 26, 2009 12:04 pm    Post subject: Reply with quote

Vive le travail d'équipe :)
_________________
Kind regards,
Xavier Miller
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Mon Oct 26, 2009 2:06 pm    Post subject: Reply with quote

Voilà, j'ai terminé le script.

Je ne connais pas bien la programmation shell donc si vous pouvez critiquer mon script j'en serai ravi.
N'hésitez pas !!!

Par exemple : Le parsage des arguments se fait il comme ça ?

Code:
#!/bin/bash

# Réduit la qualité des photos pour gagner de la place sur le disque dur
# et réoriente les photos (options -auto-orient de mogrify)
# La qualité sera réduite uniquement dans le cas où la qualité de la photo
# et supérieure à la qualité voulue

##################################################################
#         FONCTIONS
##################################################################

#Affiche les options disponibles
aide() {
   echo "$0 [options] dossiers"
   echo "-h   affiche ce message"
   echo "-R   traitement récursif des dossiers"
}


#Traite un dossier passé en paramètre
traiter_dossier() {
   for fichier in "$1/"*
      do
      #Si dossier ET que option recursif
      if [ -d "$fichier" ] && [ $recursif -eq 1 ]; then
         traiter_dossier "$fichier"
      else
         #Type mime du fichier pour tester si c'est une img
         mime=`file -i "$fichier" | awk -F ": " '{print $2}'`

         if [ "$mime" = "image/jpeg" ]; then
            #Qualité et dimensions de l'img
            eval `identify -format "qualite=%Q\ndimensions=%wx%h" "$fichier"`

            #Si qualite > qualite_min (img de qualité suffisante, on peut reduire sa qualité)
            if [ $qualite -gt $qualite_min ]; then
               echo "$fichier ..."
               mogrify -auto-orient -quality $qualite_min -adaptive-resize $dimensions "$fichier"
            fi
         fi
      fi
   done   
}



qualite_min="80"   #Qualité des photos (les img ayant une qualité < ne seront pas touchées)
recursif=0      #1 = parcours récursif des dossiers

##### Recup arguments ######
index=0;
while [ -n "$1" ]; do
   case $1 in
      -h) aide
         exit 0
         ;;
      -R)   recursif=1
         ;;
      -q) qualite_min=$2
         shift
         ;;
      *)   
         #Si dossier existe alors ajout au tableau des dossiers à traiter
         if [ -d "$1" ]; then
            dossiers[$index]="$1"
            index=$(( $index + 1 ))
         fi
         ;;
   esac
   shift
done

#Si aucun dossier en param => dossier courant
if [ ${#dossiers[*]} -eq 0 ] ; then
  dossiers[0]="$PWD"
fi

#Message d'avertissement. L'utilisateur doit donner son accord pour continuer
echo -n "Attention, les images originales seront altérées. Continuer [o/n] ?"
read reponse
if [ $reponse = "n" ]; then
   exit 0
fi

#Pour chaque dossier => parcours des fichiers
for unDossier in "${dossiers[@]}"; do
   traiter_dossier "$unDossier"
done;
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Mon Oct 26, 2009 11:36 pm    Post subject: Reply with quote

Voilà ce que j'aurais fait :
Code:
#!/bin/bash

# Réduit la qualité des photos pour gagner de la place sur le disque dur
# et réoriente les photos (options -auto-orient de mogrify)
# La qualité sera réduite uniquement dans le cas où la qualité de la photo
# et supérieure à la qualité voulue

##################################################################
#         FONCTIONS
##################################################################

# Inutile mettre une commande seule (et appelée à un seul endroit) dans une fonction

#Traite un fichier passé en paramètre
traiter() {
   if [ -d "$1" ]; then
      if [ -n "$recursif" ]; then
    for fichier in "$1"/*
    do
       traiter "$fichier"
    done
      else
          # Un répertoire mais l'utilisateur n'a pas mis -R: message d'erreur et aucun traitement
     echo "\"$1\" est un répertoire et -R n'a pas été choisi" >&2
      fi
   else
      #Type mime, qualité et dimensions de l'img (pas de awk inutile et coûteux en temp)
      eval `identify -format "mime=%C\nqualite=%Q\ndimensions=%wx%h" "$1"`
      # Pourquoi deux tests if quand on peut faire une conjonction avec -a ?
      if [ "$mime" = "JPEG" -a $qualite -gt $qualite_min ]; then
         #Si qualite > qualite_min (img de qualité suffisante, on peut reduire sa qualité)
          echo "$1 ..."
          mogrify -auto-orient -quality $qualite_min -adaptive-resize $dimensions "$1"
      fi
   fi
}



qualite_min="80"   #Qualité des photos (les img ayant une qualité < ne seront pas touchées)
# La seule présence de quelque chose dans recursif indique que l'utilisateur à choisi cette option

##### Recup arguments ######
# Pas la peine de mettre un ';' en fin de ligne
index=0
while [ -n "$1" ]; do
   case $1 in
      -h) #Affiche les options disponibles
           # un echo peut afficher plusieurs lignes
         echo "$0 [options] dossiers
-h   affiche ce message
-R   traitement récursif des dossiers"
         # Par défaut exit renvoi le succès de la dernière commande
         exit
         ;;
      -R)   recursif=1
         ;;
      -q) qualite_min=$2
         shift
         ;;
      *)   
         #Si fichier existe (l'utilisateur peut directement passer une photo en paramètre) alors ajout au tableau des fichiers à traiter
         if [ -e "$1" ]; then
            fichiers[$index]="$1"
       # J'aime pas le double parenthèsage
            let "index += 1"
         fi
   esac
   shift
done

# Trop dangereux le paramètre * par défaut

#Message d'avertissement. L'utilisateur doit donner son accord pour continuer
# Il est plus sûr de choisir "non" comme réponse par défaut !
# L'option -n1 pour un seul caractère et -p pour le prompt... et une espace après le '?' pour faire beau
read -n1 -p "Attention, les images originales seront altérées. Continuer [o/N] ? " reponse
# Un saut de ligne (toujours pour faire beau)
echo
# Les guillemets autour de $reponse évitent une erreur si l'utilisateur appuie sur entrée sans avoir entré de lettre
if [ "$reponse" = "o" ]; then
#Pour chaque dossier => parcours des fichiers
   for unFichier in "${fichiers[@]}"; do
      traiter "$unFichier"
      # Encore un inutile ';' en fin de ligne
   done
fi

Les commentaires détaillent les modifications (possibilité de passer directement des images, confirmation en une touche, etc.). Si tu veux un meilleur traitement des options, tu peux te pencher sur getopt (ou sur getopts qui est une commande "builtin" de Bash).
Back to top
View user's profile Send private message
jerep6
Apprentice
Apprentice


Joined: 02 Aug 2006
Posts: 215
Location: Landes

PostPosted: Tue Oct 27, 2009 1:25 pm    Post subject: Reply with quote

Merci pour ces corrections.

Quote:
# Pourquoi deux tests if quand on peut faire une conjonction avec -a ?

&& et -a n'ont pas le même comportement

expression1 && expression2 : si expression1 est fausse alors expression2 ne sera pas évaluée
expression1 -a expression2 : même si expression1 et fausse, expression2 sera évaluée
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Tue Oct 27, 2009 11:51 pm    Post subject: Reply with quote

Effectivement. log contient "Magic Banana" lorsque le script suivant est exécuté :
Code:
#!/bin/bash

magic ()
{
    echo -n "Magic" > log
    echo 0
}

banana ()
{
    echo " Banana" >> log
    echo 0
}

if [ `magic` = 1 -a `banana` = 0 ]
then
    echo WTF
else
    echo OK
fi

Du coup, c'est toi qui me fais découvrir des choses ! :D
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum