IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Barre de progression yad/zenity


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Barre de progression yad/zenity
    Bonjour,

    Je souhaite faire un script en bash de copie de fichier vers un serveur avec une barre de progression simple avec yad(ou zenity) pour les utilisateurs.

    Pour la copie j'utilise rsync (j'ai essayé cp aussi).

    En cherchant sur le web j'ai trouvé ça et qui fonctionne très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/bin/sh
     
    (
    echo "10" ; sleep 1
    echo "# Mise à jour des journaux de mail" ; sleep 1
    echo "20" ; sleep 1
    echo "# Remise à zéro des paramètres" ; sleep 1
    echo "50" ; sleep 1
    echo "Cette ligne est ignorée" ; sleep 1
    echo "75" ; sleep 1
    echo "# Redémarrage du système" ; sleep 1
    echo "100" ; sleep 1
    ) |
    zenity --progress \
      --title="Mise à jour des journaux système" \
      --text="Analyse des journaux de mail..." \
      --percentage=0
     
    if [ "$?" = -1 ] ; then
            zenity --error \
              --text="Mise à jour annulée."
    fi
    Mon problème je pense c'est le format de sortie de la commande rsync. Il faut à mon avis formater la sortie de rsync avant le pipe, pour avoir un truc du genre :

    pourcentage
    copie du fichier X
    pourcent
    etc
    Je cherche un moyen :
    • soit de formater la sortie de Rsync(ou cp) si c'est possible
    • Soit une méthode pour contourner le problème
    • Ou si quelqu'un connait un autre moyen en bash de faire une barre de progression personnalisable( graphique)


    Si vous avez des liens qui pourrait m’aide ou autre, je prend tout information utile.
    J'ai trouvé des scripts tout fais, mais je n'arrive pas comprendre et à les modifier. J'ai quelque notion de bash mais je suis pas un pro du scripting.

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je sais pas si ça te conviendra, la copie étant réalisée par le biais d'une redirection et non par cp ou rsync, après il y a peut-être moyen d'affiner/parser etc. j'ai pas testé outre mesure

    l'utilitaire pv (à installer explicitement) est bien utile, la commande suivante fonctionne comme attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pv -n -s $(stat -c%s fichier) fichier 2>&1 1>fichier2 | zenity --progress --percentage=0
    • le flag -n sert à demander un afficher numérique, en l'occurrence 1 nombre par ligne équivalent au pourcentage d'accomplissement
    • le -s sert à préciser la taille du fichier, qu'on récupère donc ici avec une substitution de processus et la commande stat
    • suite à quoi on trouve le fichier, pv se comporte comme cat ici
    • à ça près que le fichier est transféré sur stdout et les pourcentages affichés sur stderr, du coup on se fend de 2 redirections pour remettre dans l'ordre
    • et on pipe le tout avec zenity --progress

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut
    Merci pour t'as réponse BufferBob.

    J'aurais besoin de quelques informations sur ton code, doit on placer la copie(cp, rsync) avant le pv ? dans un fichier ? Si se n'est pas le cas, c'est que j'ai pas compris son fonctionnement.

    ps : comment faire pour afficher du code dans la fenêtré approprier

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par bbandy35 Voir le message
    J'aurais besoin de quelques informations sur ton code, doit on placer la copie(cp, rsync) avant le pv ? dans un fichier ? Si se n'est pas le cas, c'est que j'ai pas compris son fonctionnement.
    comme je te disais :
    Citation Envoyé par BufferBob Voir le message
    je sais pas si ça te conviendra, la copie étant réalisée par le biais d'une redirection et non par cp ou rsync
    (...) pv se comporte comme cat ici
    c'est comme faire un cat fichier > fichier2

    Citation Envoyé par bbandy35 Voir le message
    ps : comment faire pour afficher du code dans la fenêtré approprier
    je comprends pas la question

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Décembre 2013
    Messages : 3
    Par défaut Resolu
    Voila après de longues recherches j'ai trouvé une solution à mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/bin/bash
     
      #variable
    source=
    desti=
    pourcentage=
    ligne=1
    total_ligne=$(ls -R -l $sourcce | wc -l)
     
      #la commande de copie
    cp -vr $source $desti | 
     
      #boucle pour remplacer chaque ligne par son pourcentage 
     
    while read line; do 
    echo "$pourcentage"
    pourcentage=$((($lig*100)/$total_ligne)))
    ligne=$(($ligne+1))
    done |
     
       #Yad pour afficher la barre
    yad --progress --title=copie --percentage=0 --text="copie en cours"

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par bbandy35 Voir le message
    Voila après de longues recherches j'ai trouvé une solution à mon problème
    ça fait toujours plaisir de savoir qu'on s'est pas décarcassé pour du beurre

    ceci dit ton script n'est pertinent que lorsqu'on a plusieurs fichiers à copier, là où ma méthode n'était pertinente que dans le cas de la copie d'1 seul -gros- fichier, c'est donc deux problématiques différentes, tu aurais peut-être dû préciser

    par ailleurs ton script n'est pas juste, la sortie d'un ls -R va générer des lignes superflues entre deux répertoires, et au passage oublier de lister les fichiers cachés, le résultat n'est donc pas correct même si sur un grand nombre de fichiers ça fait illusion, il vaut mieux utiliser find à la place

    dans mon cas par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cp -vr source/ destination | wc -l
    691
    $ ls -R -l source/ | wc -l
    1037  # très léger overhead d'à peine 50%
    $ find source/ | wc -l
    691
    et tant qu'à faire on peut tout streamer avec un coup de awk par exemple, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp -vr "$source/" "$destination" | awk -vTOTAL=$(find "$source/" | wc -l) 'BEGIN{mul=100/TOTAL} {printf ("%d\n", mul*NR)}' | zenity --progress --percentage=0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Indy FTP (idFTP) faire une barre de progress de transfert
    Par Harry dans le forum Web & réseau
    Réponses: 4
    Dernier message: 09/07/2004, 13h15
  2. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 09h56
  3. Réponses: 12
    Dernier message: 27/05/2004, 00h13
  4. [DEBUTANT] Barre de progression
    Par pupupu dans le forum MFC
    Réponses: 4
    Dernier message: 18/01/2004, 16h47
  5. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo