Fortschrittanzeige von tar via dialog --gauge

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Fortschrittanzeige von tar via dialog --gauge

Beitrag von twelve » 16.04.2006 14:47:20

Hallo,

ich würde gerne eine Fortschrittanzeige für "tar" mit Hilfe von "dialog --gauge" beim dekomprimieren anzeigen.
Für "wget" habe ich bereits eine funktionierende Lösung gefunden und angepasst:
http://wiki.hedinux.org/wakka.php?wiki=SeRialFonctions

Leider habe ich bisher nur folgende zwei Seiten gefunden, die jedoch anscheinend nicht zu funktionieren scheinen:
http://codigolivre.org.br/plugins/scmcv ... root=sagu2
http://www.ivarch.com/programs/quickref/pv.shtml

Vielleicht weiss ja jemand Rat.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 16.04.2006 15:03:29

Ich würde davon abraten.

Du bräuchtest zwei komplette Durchgänge von tar. Den ersten, um die Anzahl der Dateien zu bestimmen, und den zweiten dann zum wirklichen entpacken.

twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Beitrag von twelve » 16.04.2006 15:18:38

In Ordnung. Ist es dann vielleicht möglich wärend des Entpackens eine Infobox anzeigen zu lassen?
z.B.

Code: Alles auswählen

{ tar xvft archiv.tar.gz } | dialog --infobox "Bitte warten..." 0 0

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 16.04.2006 15:40:25

Wie wäre es mit

Code: Alles auswählen

dialog --infobox "Bitte warten..." 0 0
tar xft archiv....
oder auch

Code: Alles auswählen

tar xvft archiv... | dialog --title "Entpacke Dateien..." --progressbox 0 0

twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Beitrag von twelve » 16.04.2006 16:21:15

Erst einmal danke für die Hilfe!

Code: Alles auswählen

dialog --infobox "Bitte warten..." 0 0
tar xft archiv....
... zeigt leider nur kurz die Infomeldung an und dann kommt die Ausgabe von "tar".

Code: Alles auswählen

tar xvft archiv... | dialog --title "Entpacke Dateien..." --progressbox 0 0
Ist doch eigentlich das gleiche wie meine Version, oder?

Code: Alles auswählen

tar xvft archiv.tar.gz | dialog --title "Entpacke Dateien" --infobox "Bitte warten..." 0 0
Allerdings wird auch nur kurz die Infomeldung angezeigt - diesmal wird "tar" nicht mehr ausgeführt. "Dialog" kennt übrigens kein "--progressbox".

Ich hätte gerne, dass die Infomeldung während des Entpackens angezeigt wird - keine Ausgabe von "tar".

yeti

Beitrag von yeti » 16.04.2006 16:59:23

Joghurt hat geschrieben:Du bräuchtest zwei komplette Durchgänge von tar. Den ersten, um die Anzahl der Dateien zu bestimmen, und den zweiten dann zum wirklichen entpacken.
Man könnte das in 2 Teile zerhacken: Einer liefert das Archivfile als Bytestream und macht derweil den Progressbar: Dieser Teil müsste nur an dialog die Prozente liefern, die er schon bearbeitet hat, dafür muß er nicht zweimal das Archiv lesen, es reicht die Filegröße als 100%-Marke.
Ein zweiter Prozess nimmt diesen Bytestream und jagt den durch 'tar xpf -'.
Das Ganze läuft vielleicht nicht 100% synchron, denn wenn der erste Prozeß die 100%-Marke erreicht hat, kann eine Verzögerung wegen der Pipe zwischen den Teilen entstehen, aber das wird den Nutzen nicht bis zur Wertlosigkeit verzerren...

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 16.04.2006 16:59:53

twelve hat geschrieben:... zeigt leider nur kurz die Infomeldung an und dann kommt die Ausgabe von "tar".
Warum gibst du auch "t" mir an? xf gibt keine Ausgaben.
"Dialog" kennt übrigens kein "--progressbox".
Meins schon...

Ich hätte gerne, dass die Infomeldung während des Entpackens angezeigt wird - keine Ausgabe von "tar"

Mein erstes Beispiel, ohne "t"
Zuletzt geändert von Joghurt am 16.04.2006 21:07:03, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 16.04.2006 20:22:46

auch ne Möglichkeit:

Code: Alles auswählen

 { tar -xzf archive.tar.gz & }; dialog --infobox "bitte warten ..." 0 0; wait %%
Gruß
gms

twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Beitrag von twelve » 19.04.2006 19:42:56

Die Variante von gms funktioniert ganz gut, allerdings muss man %% in $! abändern:

Code: Alles auswählen

{ tar xzf archive.tar.gz & }; dialog --infobox "bitte warten ..." 0 0; wait $!
Joghurt
Mein "dialog" (Version: 1.0-20050306) kennt "--progressbox" nicht, und ich habe auch mit Google und auf der Homepage von "dialog" nichts in der Richtung gefunden.
Es wird also anscheinend nicht standardmäßig unterstützt.

yeti
Die Variante wäre anscheinend genau was ich haben wollte. Ich kann es zwar nachvollziehen, aber nicht umsetzen.
Wäre super, wenn mir jemand erklären könnte wie das funktioniert.


Danke an alle.
Gruß Robert
Zuletzt geändert von twelve am 19.04.2006 20:58:32, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 19.04.2006 19:56:43

twelve hat geschrieben:Die Variante von gms funktioniert ganz gut, allerdings muss man %% in $! abändern:
komisch, bei mir funktionieren beide Varianten
%% sollte eigentlich genauso der "current job" also der tar-Prozeß im Hintergrund sein.
Verwendest du die Bash oder eine andere Shell ?

Gruß
gms

twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Beitrag von twelve » 19.04.2006 20:03:45

Ich verwende die ganz normale Bash.

Wenn ich eingebe, kommt: "bash: fg: %%: no such job" bei wird die pid des letzten Befehls angezeigt.
Die pid des der (aktuellen) Bash, die den Befehl ausgeführt hat, lässt sich mit anzeigen.

Gruß
Robert

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 19.04.2006 20:07:13

danke, wieder was gelernt. Dann werde ich in Zukunft auch $! verwenden

Gruß
gms

twelve
Beiträge: 39
Registriert: 10.02.2006 14:49:17

Beitrag von twelve » 19.04.2006 20:59:39

Ich habe zu danken :D

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 19.04.2006 23:06:59

twelve hat geschrieben:Die Variante wäre anscheinend genau was ich haben wollte.
OK, you asked for it, now you have to live with it ;)

Code: Alles auswählen

#!/bin/sh
FILE=Datei.tar.gz
SIZE=$(stat --printf "%s" $FILE)
COUNT=0
# BLOCKSIZE nicht zu klein wählen, je größer, desto besser, desto seltener
# wird jedoch der Balken aktualisiert
BLOCKSIZE=524288
( while [ $COUNT -lt $SIZE ]; do
    dd bs=$BLOCKSIZE count=1 2>/dev/null
    COUNT=$(expr $COUNT + $BLOCKSIZE)
    PER=$(expr 100 \* $COUNT / $SIZE)
    if [ $PER -gt 100 ]; then PER=100; fi
    echo $PER 1>&3
  done < $FILE | tar xzf - ) 3>&1 | dialog --title "Entpacke..." --gauge "Jetzt wäre eine gute Gelegenheit, die Registrierungskarte auszufüllen" 0 0
Und da sage noch jemand, Shellprogrammierung sei unübersichtlich :wink:

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 19.04.2006 23:49:24

wow geil :)
Einen kleine Anregung hätte ich noch:
Damit der Balken bei kleinen Dateien nicht zu sehr springt und bei großen Dateien eine unnötig kleine Granularität vermieden wird, könnte die BLOCKSIZE aus der Dateigröße ermittelt werden:
z.B.:

Code: Alles auswählen

BLOCKSIZE=$(expr $SIZE / 100)
Gruß
gms

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 20.04.2006 00:36:07

Eine konstante Blockgröße hat den Vorteil, dass immer in selben Zeitabständen aktualisiert wird.

Es reicht ja, einmal pro Sekunde den Fortschritt zu zeigen, und der kann ja ruhig von 20 auf 70% hüpfen. Ansonsten wird unnötig Zeit mit der Darstellung verbracht. (Ein paar Windowsinstaller sind da berühmt. Da sie meinen, jedesmal jeden Dateinamen anzeigen zu müssen, brauchen sie 1 Minute zum entpacken, obwohl es auch in 10 Sekunden gegangen wäre...)

Aber jeder, wie er will.

Antworten