Créer un sous-dossier avec les thumbnail png

Publié le par Levi59

Un petit exercice que je me suis amusé à faire...

Énoncé:

Ecrire un script-schell référencé imagette qui admet en argument :

  • Un nom de répertoire
  • Une date au format aammjj
Et qui créé, pour chaque image au format « point jpg » contenue dans le répertoire passé en argument et dont la date de dernière modification est postérieur à celle passée en second argument, une imagette (thumbnail) au format « point png » et de taille 100x100 pixels.
Ces imagettes sont placées dans un nouveau répertoire référencé miniatures et créé dans le répertoire passé en première argument.

 

Indications :
Pour comparer les dates, il semble judicieux de les représenter en nombre de secondes depuis l’Epoch, c’est-à-dire depuis la date initiale à partir de laquelle est mesurée le temps sous Unix ( soit le 1er janvier
1970, 00:00)
Pour cela :

  • La commande date peut convertir une date donnée sous le format aammjj en nombre de secondes depuis l’Epoch.
  • La commande stat peut récupérer la date de dernière modification d’un fichier et là aussi, la convertir en nombre de secondes depuis l’Epoch.
  • La commande convert permet de réaliser via la ligne de commande, un grand nombre d’opérations sur les images : conversion d’un type à un autre, redimensionnement,…
Exemple : convert photo.jpg photo.gif
      Elle peut également créer des imagette avec l’option –thumbnail, par exemple
     Convert photo.jpg –thumbnail ‘200x200’ thumb.jpg

 

Contraintes:
On programmera dans « l’esprit Unix ». On oubliera donc pas de tester :

  • Le nombre d’argument
  • L’existance et le type du fichier passé en argument
  • L’autorisation du droit d’écriture sur ce répertoire ( pour permettre la création du sous répertoire miniatures )
  • Le format correct de la date passée en arguments.
Le code de retour renvoyé sera :
  • Egal à 1 en cas de problème d’argument
  • Egal à 2 en cas de problème d’existence ou de type du fichier passé en argument
  • Egal à 3 en cas de problème de droit d’écriture
  • Egal à 4 en cas de problème de format de date
  • Conforme à l’esprit Unix si tout va bien

 

Il ne répond pas forcement à l'énoncé mais celui-ci n'indiquant pas clairement le format pour les options, on peux dire qu'il est bon.

imagette:

#!/bin/bash
# script pour copier les .jpg d'un dossier et dont la date de dernière modification
# est postérieurs à une date donnée, dans un sous répertoire "miniatures" et
# les convertir en thumbnail 100x100 au format .png.
#
# Copyright (C) 29 dec. 2010, Rombeaut Rodolphe
# http://scriptam.over-blog.com/
# Released into the public domain.

myhelp ()
{
printf '\n************************************************\n\nOptions -f et -d obligatoires.\n\nUsage : imagette [options] <valeur>\nOptions : \n  -h\t\t\tHelp\n  -o\t\t\tDo not overwrite\n  -f <dossier>\t\tDossier cible\n  -d <date>\t\tDate au format aammjj\n\n************************************************\n'
}

i=0
while getopts :f:d:ho option
do
[ "${option}" = "f" -o "${option}" = "d" ] && ((i++))
    case "${option}" in
        h)
        myhelp ;
        exit 0
    ;;
   
    f)
        folder="${OPTARG%\/}";
        ;;

        d)
        date=$OPTARG;
        date_epoch=`date -d ${date} '+%s'`;    # date donnée en seconde depuis Epoch
        erreurdate=$?;                # erreur sur date?
        ;;                    # sortie standard=0 (pas d'erreur)

        o)
        overwrite="no"
        ;;

        :)
        echo >&2 "Argument manquant pour l'option '${OPTARG}'"
        myhelp
        exit 1
        ;;

        ?)
        echo >&2 "Option invalide : '${OPTARG}'"
        myhelp
        exit 1
        ;;

        *)
        echo >&2 "Erreur inconnue"
        exit 5 ;;

    esac
done

[ "${i}" != "2" ] && {
    echo >&2 "Argument manquant (Erreur 1)"
    myhelp
    exit 1
}

! [ -d ${folder} ] && {                # n'est pas un dossier?
    echo >&2 "${folder} n'est pas un dossier (Erreur 2)";
    myhelp
    exit 2
} || {
    ! [ -w "${folder}" ] && {            # ne possède pas droit en écriture?
        echo >&2 "${folder} est protégé en écriture (Erreur 3)"
        exit 3
    }
}

[ ${erreurdate} -ne 0 ] && {            # Si erreur lors de la commande
    echo >&2 "${date} n'est pas une date valide (Erreur 4)";    # date alors format invalide
    myhelp
    exit 4
}

OLDIFS=$IFS
IFS="
"                        # IFS redéfini en retour à la ligne
files=""
cd ${folder}
shopt -s nocaseglob
nbrfiles=0
for file in *.jpg
do
    [ -f "${file}" ] && {
        datefile=`date -r ${file} '+%s'`        # pour chaque fichier, convertir en valeur epoch
        [ "${datefile}" -gt "${date_epoch}" ] && {    # si fichier postérieur à date donnée
            ((nbrfiles++))
            [ -n "$files" ] && {
            files=`echo -e "${files}\n${file}"`
            } || {
            files=`echo -e "${file}"`   # lister les fichier dans $files
            }
        }
    }
done

date2=`date -d ${date} '+%d %B %G'`        # afficher une date "normale"
[ -z "${files}" ] && {            # Si pas de valeurs stockées, alors
                                # il n'existe pas de nouvelles miniatures
    echo >&2 "Il n'y a pas de fichier .jpg postérieur au ${date2} (Erreur 2)";
    exit 2
}

mkdir -p miniatures            # Créé sous répertoire miniature
nbrfiles2=0
for file in ${files}
do
    filename=`echo ${file%.*}`            # Récupérer nom fichier pour traitement
    [ -f "./miniatures/thumb.${filename}.png" -a "${overwrite}" = "no" ] && {
    ((nbrfiles2++))
    } || {
    convert "${file}" -thumbnail 100x100 "./miniatures/thumb.${filename}.png"
    };
done

[ "${nbrfiles}" -eq "${nbrfiles2}" ] && {
    echo "Pas de convertion effectuée"
    echo "Il n'y a pas de fichier '*.jpg' postérieurs au ${date2} qui n'est pas été déjà convertis en '*.png' et qui ne soit pas déjà enregistrés dans le dossier"
    echo "'${folder}/miniatures/'"
} || {
# Message pour indiquer que tout s'est bien passé
    echo "Convertion terminée!"
    echo "Les nouveaux fichiers '*.jpg' postérieurs au ${date2} ont été convertis en '*.png' et enregistrés dans le dossier:"
    echo "'${folder}/miniatures/'"
}
IFS=$OLDIFS                    # Rétablir IFS
exit 0

Publié dans Outils

Commenter cet article