16
juillet 2009

Script shell et barre de progression

Aujourd'hui j'ai réalisé un script qui n'a rien d'exceptionnel. En gros il lit un fichier ligne par ligne, utilise cette lecture pour faire une requête sql et ensuite copie un fichier par rapport au résultat de la requête. Ce qui est intéressant au contraire est la mise en place d'une barre de progression. Au début je n'en avais pas prévue mais comme il est possible que le traitement soit long j'ai préféré avoir une info de l'avancement.

Pour commencer le script

#!/bin/bash

# Copie des fichiers hautes définitions par rapport à un
# fichier contenant uniquement le nom des fichiers sans extension

ROOT="/home/user/cp_image"
SRC="https://philippe-maladjian.fr/src"
OUT="/out/export"
FILE="$ROOT/export.csv"
MYSQLDIR=$(which mysql)
DIRNAMEDIR=$(which dirname)
CPDIR=$(which cp)
SEDDIR=$(which sed)
BASENAMEDIR=$(which basename)
RMDIR=$(which rm)
WCDIR=$(which wc)
BCDIR=$(which bc)
CUTDIR=$(which cut)
USER="user mysql"
PASS="passe mysql"
I=1
NBLIGNE=0

RM=`$RMDIR $ROOT/export.log`
if [ $? -ne 0 ]
then
        echo "Impossible de supprimer le fichier $ROOT/export.log"
fi

NBLIGNE=`wc -l $FILE | cut -d" " -f1`

while read LIGNE
do
        RESULT=`$MYSQLDIR -h localhost --user=$USER --password=$PASS -B -s -e "SELECT path FROM phpwebgallery_images WHERE name='$LIGNE'" phpwebgallery_prod`
        if [ $RESULT ]
        then
                DIR=`$DIRNAMEDIR $RESULT`
                FILE=`$BASENAMEDIR $RESULT`
                DIR=`echo $DIR | $SEDDIR 's/\.\///'`
                CP=`$CPDIR $SRC/$DIR/pwg_high/$FILE $OUT`
                if [ $? -ne 0 ]
                then
                        echo "Une erreur c'est produite pendant la copie du fichier $FILE" >> $ROOT/export.log
                fi
        else
                echo "Pas d'image pour la référence $LIGNE" >> $ROOT/export.log
        fi

        PROGRESS=`$BCDIR -l <<< "($I/$NBLIGNE)*100" | $CUTDIR -d"." -f1`
        echo -ne "Progression : $PROGRESS%\r"

        let "I=$I+1"

done < $FILE

exit 0

Pour commencer il faut avoir une valeur de référence pour calculer le poucentage, dans le script c'est la ligne :

NBLIGNE=`wc -l $FILE | cut -d" " -f1`

Elle compte tout simplement le nombres de lignes dans le fichier. Ensuite la partie qui permet de calculer et gérer l'affichage :

PROGRESS=`$BCDIR -l <<< "($I/$NBLIGNE)*100" | $CUTDIR -d"." -f1`
echo -ne "Progression : $PROGRESS%\r"

En bash les nombres sont toujours des entiers donc pas moyen d'avoir un 0,5, par exemple :

echo `expr 1 / 87`

Renvoie 0, alors que le résultat 0,010309278.

Pour contourner le problème il faut utiliser la commande bc qui permet de faire de vrai calcul. L'expression n'a rien de compliqué et le cut permet de récupérer uniquement la valeur entière du résultat. Maintenant il faut gérer l'affichage en console :

echo -ne "Progression : $PROGRESS%\r"

Voila maintenant vous n'avez plus d'excuse pour dire "Mais ou en est mon script ?" ;)

Administrateur système de métier mais surtout curieux de découvrir de nouvelles technos très orientées DIY. A mes heures perdues je fais de la photo avec toujours une petite envie d'intégrer des DIY sous forme de timelaps à base de raspberry.

3 commentaires

bong101 a dit

Bonjour

Merci pour cette petite astuce...bioen pratique et pas compliquée à mettre en oeuvre

CDT

Répondre

test a dit

Merci pour ton article qui va me servir dans mes scripts de backup.

Répondre

Merimac a dit

Merci pour ton article qui va me servir dans mes scripts de backup.

Bonne continuation

Répondre

Écrire un commentaire

Quelle est la troisième lettre du mot xzlhj ? :

Script shell et barre de progression - Philippe Maladjian - Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues