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 ?" ;)