# [BASH] gauge de décompression avec dialog / Xdialog [résolu]

## BoOmSlAnGz

Bonjour à tous ! :]

Voilà je recherche actuellement un moyen pour pouvoir créer une gauge avec dialog permetant de montrer la progression de décompression d'un fichier .tar.bz2

j'ai trouvé quelques exemples d'utilisation mais jamais sur la décompression de fichier, pourtant je suis convaincu que ca doit être possible.

Voilà, si quelqu'un peut m'éclairer :]

Merci, bonne soirée.

 :Smile: 

----------

## Enlight

Ben tu veux te baser sur quoi pour connaitre l'avancement de la décompression et le temps total nécessaire?

----------

## BoOmSlAnGz

 *Enlight wrote:*   

> Ben tu veux te baser sur quoi pour connaitre l'avancement de la décompression et le temps total nécessaire?

 

Bah j'en sais rien en fait !  :Razz: 

c'est pour ça que je demandes :]

----------

## Enlight

Donc c'est pas un problème lié à xdialog, mais plutôt un truc genre [TAR] estimer l'avancement d'une décompression. Ben je viens de RTFM en travers, on va dire que s'il existe un méthode, elle m'a pas sauté au visage vu que je ne vois pas de moyen autre qu'ultralong de savoir combien il y'a de fichiers dans une archive tar...  :Confused: 

----------

## kopp

Quoi qu'il en soit, il doit bien y avoir un moyen d'estimer, vu que des applications comme file-roller le font. Après, c'est surement du code en C ou autres langage évolué, donc je ne sais pas si c'est transcriptible en bash. Je te suggèrerais bien de regarde le code de telles applications, mais ça risque d'être compliqué.

Enfin, toujours est-il, en français, on dit jauge, sinon ça ne se prononce pas pareil.

----------

## TGL

En code crade, ça pourrait donner un truc de ce genre, en se basant sur la liste des fichiers contenus dans l'archive : 

```
#!/bin/bash

xdialog_progress() {

   local count=0 percent=0 previous_percent

   while read line ; do

      ((count += 1)) ; ((percent = 100 * count / ${3}))

      [[ $percent -gt 100 ]] && percent=100

      [[ $percent == $previous_percent ]] || \

         { echo $percent ; previous_percent=$percent ; }

   done | Xdialog --title "${1}" --gauge "${2}" 5 40 0

}

total=$(tar -tjf "${1}" | wc -l)

tar -xvjf "${1}" | xdialog_progress "Yo !" "Unpacking..." ${total}
```

En gros, la fonction xdialog_progress() prend trois paramètres :

 - un titre ;

 - un texte ;

 - le nombre de lignes attendues.

Et puis elle lit son entrée standard, et fait avancer une barre Xdialog à mesure qu'elle bouffe des lignes. 

Ici, l'utilisation est la décompression d'un .tar.bz2, mais ça pourrait être autre chose.

Niveau perfs, je suis d'accord que c'est un peu naouak de décompresser 2 fois l'archive, mais en même temps c'est pas forcement si catastrophique que ça, grâce au cache d'IO : la première lecture a des chances raisonnables de mettre le .tar.bz2 en mémoire, rendant la vraie décrompression assez efficace... Ça me rappelle des benchs où, dans certaines conditions, un "cat dump.tar > /dev/null && tar xf dump.tar" était plus rapide qu'un simple "tar xf dump.tar" (because lecture d'abord puis écriture ensuite, au lieu de mettre les deux en concurrence et donc de faire sauter tout le temps la tête du disque dur d'un bout à l'autre de ses plateaux).

----------

## BoOmSlAnGz

TGL, intéressante ta méthode  :Smile: 

Seul problème c'est que je veux utiliser ca pour de très gros fichiers ... c'est pour ça que j'ai besoin de ça en fait :]

donc si je doit decompresser des fichier des 500Mo deux fois ça le fait pas  :Razz: 

----------

## Enlight

Oui mais la jauge n'en sera que plus faussée car on a besoin de beaucoup de temps pour connaître $3.

sinon contre le cat $file > /dev/null, y'a aussi readahead-list dans portage.

parcontre effectivement en partant du principe qu'en décompressant un tar.{gz,bz2}, le temps de tar est négligeable, on paut utiliser tar -xvpf et compter les lignes que ça sort. avant de lancer l'unzip (ou le bzip2) définittif.

mais... tar -xvpf

 *Quote:*   

> real    0m0.094s
> 
> user    0m0.060s
> 
> sys     0m0.028s

 

tar -xvjpf

 *Quote:*   

> real    0m0.098s
> 
> user    0m0.076s
> 
> sys     0m0.020s

 

... mauvais exemple j'espère   :Confused: 

----------

## Saigneur

Salut

Et si la barre était le reflet de la lecture dans le fichier compressé ? C'est peut-être faux, mais c'est un bon début non ?

Bon évidemment, si on a un fichier vide de 2Go, il prendra peut-être bcp de temps à écrire dans le FS alors qu'il ne prendra qu'une poignée d'octets dans le fichier compressé...

----------

## TGL

 *BoOmSlAnGz wrote:*   

> donc si je doit decompresser des fichier des 500Mo deux fois ça le fait pas 

  Ouais nan mais on est d'accord : pour des fichiers relativement petits, y'a pas réellement de surcoût grâce au cache d'IO, mais pour des gros la première lecture est faite en pure perte (on trash le cache avant de s'en servir), et là ça devient abhérant. Perso, je donnais plus ce code pour le côté bash/xdialog de la chose, au cas où ça intéresse qlqun, mais je suis bien conscient de ses limites.

Bon sinon, je sais qu'il existe qlqpart sur terre un petit programme qui permet de faire un "cat" avec une jauge de progression (textuelle par contre). Avec ça, t'as ton truc fastoch' et sans surcoût, genre "cat_avec_jauge fichier | tar xj".

Mais je ne me souviens vraiment plus du nom de ce machin... aïe, nan, pas taper /o\

<troll>

Bon et puis de toute façon, zut, les jauge ça sert à rien : le temps que tu calcules combien de secondes il te reste à attendre, en général t'es arrivé à 100%. Perso je vote pour les simples "action_verbeuse | truc_animé" (ou "action_verbeuse" peut être ton "tar xvjf fichier", et "truc_animé", par exemple, un fonction qui fait tourner un spinner façon calcul des dépendances de emerge). Le tout, c'est que l'utilisateur sache que son programme (ou son ordi...) n'est pas dans les chous, mais de là à vouloir une mesure précise...

</troll>Last edited by TGL on Tue Jan 24, 2006 8:44 pm; edited 1 time in total

----------

## TGL

 *Saigneur wrote:*   

> Et si la barre était le reflet de la lecture dans le fichier compressé ?

 

On s'est croisé, mais en fait c'est exactement ce qui se passerait avec le "cat_avec_jauge" dont je ne retrouve plus le nom. Le problème étant que je vois pas comment simuler la même chose en bash. Ou bien, y aurait-il moyen de boucler sur une lecture par bloc, genre avec dd, et de piper le tout vers le tar de décompression ? Hmm... ça devient gore...

----------

## Enlight

tu veux du gore?  :Mr. Green: 

```
size=stat $1 | grep Size: | awk '{print $2}';

for i in `seq 0 $(($size - 1))`;

do

dd if=$1 bs=1 count=1 skip=$i | tar -xj;

done

```

On peut partir la dessus, par contre ça risque d'être lent et si on modifies bs (en recalculant skip arrondi au supérieur je sais pas ce que ça donne...)

edit avec $1 = nom de fichier bien sur

----------

## TGL

 *Enlight wrote:*   

> tu veux du gore? 

 

Bah là t'abuses un peu ("grep | awk", blocs de 1 octet, tar dans la boucle, etc.), mais enfin ouais, c'est ça l'idée...

Celui là devrais +/- marcher :

```
#!/bin/bash

total_size=$(stat -c%s "${1}")

((block_size = total_size / 50))

[[ $block_size -gt 1048576 ]] && block_size=1048576

[[ $block_size -lt 65536 ]] && block_size=65536

dumped_size=0

dumped_blocks=0

percent=0

previous_percent=none

( while [[ $dumped_size -lt $total_size ]] ; do

   dd if="${1}" bs=$block_size skip=$dumped_blocks count=1 2>/dev/null

   ((dumped_blocks += 1 )) ; ((dumped_size += block_size))

   ((percent = 100 * dumped_size / total_size))

   [[ $percent -gt 100 ]] && percent=100

   [[ $percent != $previous_percent ]] && \

      { echo $percent >&3 ; previous_percent=$percent ; }

done | tar tj >/dev/null ) \

3>&1 1>&2 | Xdialog --title "Yo !" --gauge "Unpacking..."  5 40 0
```

Niveau taille de bloc, bof, j'ai mis des trucs assez pifométrique :

 - on vise à avancer à coup de 2%

 - si ça fait des blocs de plus de 1Mo, on les limite à 1Mo

 - si ça fait des blocs de moins de 64ko, on les limite à 64ko

C'est juste des valeurs qui sonnent bien, donc voilà.

Mais mon seul bench, ça a été que ça rame si on multiplie trop les blocs... Pas de surprise en fait : genre à coup de 1 ou 2 ko sur un fichier de qlqs Mo, ça fait vite des milliers d'itérations qui forkent autant de "dd", et paf !

Bon, enfin bref, on approche d'un truc décent là   :Rolling Eyes: 

----------

## Enlight

 *kopp wrote:*   

> 
> 
> Enfin, toujours est-il, en français, on dit jauge, sinon ça ne se prononce pas pareil.

 

Je me permets de plussoyer ça surtout que :

1) le mot est employé dans le titre

2) Gauge c'est une actrice de boules  :Mr. Green:  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire   :Rolling Eyes: 

----------

## boozo

 *Enlight wrote:*   

> 2) Gauge c'est une actrice de boules  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire  

 

MdR !   :Laughing: 

----------

## kopp

 *Enlight wrote:*   

> 2) Gauge c'est une actrice de boules  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire  

 

D'où est-ce que tu connais ça toi ? Tu as encore menti à des sites web !!!!  :Wink: 

----------

## Enlight

 *kopp wrote:*   

>  *Enlight wrote:*   2) Gauge c'est une actrice de boules  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire   
> 
> D'où est-ce que tu connais ça toi ? Tu as encore menti à des sites web !!!! 

 

 :Embarassed:  heu... ben j'ai inocement tapé "gauge" dans google et tout aussi inocement cliqué sur les liens qui en sont sortis et hum... parceque bien entendu avant j'avait aucune idée qu'il existait un actrice ainsi nommée et tu me connais, hein c'est pas mon genre d'aller regarder des cochonneries sur internet et moi à part les pages de man y'a que ça qui m'interesse et non je tripe pas sur Denise Richards et puis je leur ai pas vraiment menti à ces sites, il précisent pas age mental ou age physique donc...

----------

## anigel

 *TGL wrote:*   

> Bon sinon, je sais qu'il existe qlqpart sur terre un petit programme qui permet de faire un "cat" avec une jauge de progression (textuelle par contre). Avec ça, t'as ton truc fastoch' et sans surcoût, genre "cat_avec_jauge fichier | tar xj".

 

Oui, je me rappele avoir déjà vu ça aussi. J'ai jeté un oeil du côté de wget, mais il ne permet pas de lire un fichier local (?)... C'est bien dommage, car il aurait alors suffi de lui spécifier de sortir son résultat sur sa ligne de commande, et il se serait occupé tout seul comme un grand de la barre de progression (option -O -). Il ne restait plus qu'un peu de plomberie à faire ensuite...

----------

## -KuRGaN-

 *enlight wrote:*   

> 2) Gauge c'est une actrice de boules  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire 

 

Bon ben moi les gars je vous en demande plus, je voudrais une jauge en forme de Gauge !!!!!!!!!!!!!!!!!!!   :Laughing:   :Laughing: 

----------

## yoyo

Juste comme ça en passant :  *man bzip2 wrote:*   

> -p --show-progress
> 
>               Show  percentage of input-file done and while compressing show the percentage of the original
> 
>               file the new file is.

 

Il n'y a pas moyen de faire le "bunzip2 -p", de rediriger la sortie vers un "tar -x" et de conserver l'affichage du pourcentage d'avancement ??

EDIT : je viens de re rtfmer et j'ai trouvé ça :  *man tar wrote:*   

>  -j, -I, --bzip
> 
>               filtrer l'archive via bzip2. Note : l'option -I est très
> 
>               déconseillée et pourra avoir une  autre  significa-
> ...

 Il n'y aurait pas moyen en mettant un alias d'avoir la progression directement ??

EDIT bis : bon, le coup de l'alias, ça ne fonctionne pas ... (ça aurait été trop simple)

----------

## Enlight

 *-KuRGaN- wrote:*   

>  *enlight wrote:*   2) Gauge c'est une actrice de boules  ça va pas aider ceux qui veulent googler pour trouver une autre manière de faire  
> 
> Bon ben moi les gars je vous en demande plus, je voudrais une jauge en forme de Gauge !!!!!!!!!!!!!!!!!!!   

 

Je crois qu'il existe un prog de strip tease en fonction de la charge cpu, ça doit pouvoir s'adapter   :Wink: 

----------

## -KuRGaN-

 *enlight wrote:*   

> Je crois qu'il existe un prog de strip tease en fonction de la charge cpu, ça doit pouvoir s'adapter 

 

Ca devrait être direct dans le stage3 ce genre de logiciel, au moins les gens lanceraient plus souvent des emerge -euD world   :Laughing:   :Laughing: 

----------

## kernelsensei

pour info voila le lien : http://dindinx.net/hotbabe/

----------

## arlequin

 *Enlight wrote:*   

> Je crois qu'il existe un prog de strip tease en fonction de la charge cpu, ça doit pouvoir s'adapter  

 

Effectivement :

```
*  app-admin/hot-babe

      Latest version available: 0.2.0

      Latest version installed: [ Not Installed ]

      Size of downloaded files: 388 kB

      Homepage:    http://dindinx.net/hotbabe/

      Description: A System load monitor

      License:     Artistic
```

Il a défrayé la chronique chez nos amis utilisateurs de Debian, parce que beaucoup de gens consideraient que ce genre de programme n'avait pas sa place parmis les sources officielles de paquets debian. Apparement c'est trop osé pour eux.

Heureusement que l'arbre protage est moins prude (qui a dit 'USE flag offensive' ???)

Edit1: apparement kernel_sensei semble plus prompt que moi sur le sujet   :Wink: 

Edit2: en fait, kernel_sensei vient de me faire remarquer que l'build n'est pas dans portage... mais qu'on peut le télécharger sur le site sus nommé

----------

## Uggy

Peut etre que cela peut servir ?

```
pv - monitor the progress of data through a pipe

13,1kO 0:00:00 [ 496kO/s] [=================================>] 100% ETA 0:00:00
```

Je vous laisse avec le man..  :Wink: 

----------

## TGL

 *Uggy wrote:*   

> Peut etre que cela peut servir ?

 

Ah, yes, c'est ça le « cat à jauge » que je cherchais. Merci beaucoup, je sais pas comment j'aurais retrouvé sans toi, et ça me tracassait...  :Smile: 

----------

## Uggy

De rien..   :Wink: 

Au moins, mon 1er post aura été utile..   :Wink: 

----------

## TGL

 *Uggy wrote:*   

> Au moins, mon 1er post aura été utile..  

 

Erf, j'avais pas fait attention...

Et bien bravo, tu as donc gagné un point de Super-Bienvenue®, qui ne peut être délivré qu'à l'occasion d'un 1er post apportant une réponse utile au lieu d'une question sur la configuration du make.conf. Avec seulement deux points¹, on a le droit à une bouteille de Champagne ! 

¹ Il semble cependant qu'un bug facheux dans leurs règles d'attribution ne laisse aucune possibilité d'en obtenir un jour un second...

----------

## anigel

 *TGL wrote:*   

> ¹ Il semble cependant qu'un bug facheux dans leurs règles d'attribution ne laisse aucune possibilité d'en obtenir un jour un second...

 

Je suis au regret de confirmer cet état de faits : la valeur du nombre de points n'est stockée que sur 1 seul bit, par manque de place mémoire, et ne peut donc prendre comme valeurs que 0 ou 1. Le fait de donner une seconde réponse utile fait donc repasser le score à 0. C'est triste, mais de nos jours le bit vaut trop cher pour gaspiller  :Wink:  .

Bienvenue à toi, et merci de nous avoir éclairé  :Wink:  !

----------

## kopp

Eh bah ! Si même les modos se mettent à dire n'importe quoi !! Ils vont finir par ne plus avoir besoins de nous : ils sont sages, savants, et ils savent dire des bêtises, que nous reste-t-il ?!

----------

## Uggy

ehh bien je vois que la bonne humeur est de mise sur ce forum...  :Wink: 

Je crois que je vais continuer a trainer dans le coin, meme si mon point de Super-Bienvenue® ne me permettra pas de gagner la bouteille de champ   :Very Happy: 

----------

## BoOmSlAnGz

Merci pour toutes ces réponses ! je vai essayer de me débrouiller avec tout ça !

encore merci :]

----------

