Uitpakken met tar: voorgang weergeven?

Pagina: 1
Acties:

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Ik ben bezig met een shell scriptje die wat dingetjes installeerd. Er wordt oa. een groot tar bestand uitgepakt. Ik wil de voorgang van het uitpakken graag weergeven met een 'gauge' met het programma dialog. (Zo'n progressbar zeg maar) Daarvoor is het nodig om tar zo uit te laten voeren dat om de zoveel tijd een getal op stdout wordt gezet dat het percentage van de voorgang voorsteld. 1 getal per regel. De hele reeks moet afgesloten worden met EOF.

Nu heb ik op de manpage van tar gekeken maar tar heeft geen optie om zoiets op de stdout te zetten. Weet iemand misschien een handig stukkie scriptcode om dit wel voor elkaar te krijgen. (Of gewoon wat tips, dan verzin ik de code wel)

(Ik weet dat het mogelijk is, ik heb zoiets wel eerder gezien. Ik kan het helaas niet meer vinden)

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 16:17

odysseus

Debian GNU/Linux Sid

Een manier die een benadering geeft maar absoluut niet precies hoeft te zijn is wel te verzinnen. Zorg dat je eerste kijkt hoeveel bestanden er in de .tar zitten. Vervolgens ga je uitpakken met de optie -v, waardoor je voor elk bestand een regel uitvoer krijgt. Schrijf nog wat code dat het huidige aantal regels uitvoer telt en je kunt met huidig/totaal * 100 het voortgangspercentage berekenen.
Natuurlijk kan het veel preciezer door naar de grootte van bestanden binnen de .tar te gaan kijken, maar dat maakt het een hoop ingewikkelder.

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Op maandag 01 april 2002 15:57 schreef odysseus het volgende:
Een manier die een benadering geeft maar absoluut niet precies hoeft te zijn is wel te verzinnen. Zorg dat je eerste kijkt hoeveel bestanden er in de .tar zitten. Vervolgens ga je uitpakken met de optie -v, waardoor je voor elk bestand een regel uitvoer krijgt. Schrijf nog wat code dat het huidige aantal regels uitvoer telt en je kunt met huidig/totaal * 100 het voortgangspercentage berekenen.
Natuurlijk kan het veel preciezer door naar de grootte van bestanden binnen de .tar te gaan kijken, maar dat maakt het een hoop ingewikkelder.
Ik heb hier idd al een beetje aan zitten denken, het probleem is alleen dat de grootte van de bestanden veel verschilt. Dan krijg je zo'n windows-achtige balk die eerst keihard vooruitknalt en dan ergens een half uur blijft hangen.

Is het mogelijk om arrays in een bash script te gebruiken? Daar kan ik dan misschien de grootte van elke file in donderen.

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 16:17

odysseus

Debian GNU/Linux Sid

Bash ondersteunt inderdaad arrays, al heb ik er zelf nooit mee gewerkt. Zie de Bash-howto op linuxdoc.org voor meer informatie erover.

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Bash howto? Wist niet datie bestond... gaan we gelijk ff doorspitten. Tnx :)

Verwijderd

Kijk hier eens : http://linuxdoc.org/LDP/abs/html/index.html
Daar staat een complete bash scripting guide. :)

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Er schoot me zonet een ideetjuh binnen hoe het misschien ook zou kunnen *D:

Als ik nou een klein programmatje maak die een bestand inleest en doorvoerd naar de stdout. Terwijl hij dat doet berekend hij bij elk blok wat hij inleest op welk percentage die zit. Dat getal stuurtie naar stderr of naar een named pipe ofzo.

Dan moet tar op de volgende manier worden aangeroepen:
code:
1
2
3
mijnprogram bestand.tar naamvanpipe | tar -x&

cat naamvanpipe | dialog --gauge Tekst 20 50 0

Mijnprogram leest dus bestand.tar, stuurt die naar stdout en schrijf het voortgangspercentage naar naamvanpipe. Gaat dit werken???

  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 28-07 15:42

RvdH

Uitvinder van RickRAID

Op dinsdag 02 april 2002 01:33 schreef metaal het volgende:

cat naamvanpipe | dialog --gauge Tekst 20 50 0[/code]
Mijnprogram leest dus bestand.tar, stuurt die naar stdout en schrijf het voortgangspercentage naar naamvanpipe. Gaat dit werken???
Nee, tar zal dat niet accepteren, die accepteerd alleen een volledige tarfile en geen stukjes.

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Op dinsdag 02 april 2002 07:14 schreef strlen het volgende:

[..]

Nee, tar zal dat niet accepteren, die accepteerd alleen een volledige tarfile en geen stukjes.
Ik heb het al lopen proberen, en het werkt. De opdracht cat bestand.tar | tar -x werkt ook, probeer maar eens. Het programmatje wat ik heb gemaakt werkt in princiepe het zelfde als cat, maar heeft nog een tweede argument nodig, namelijk het pad van het bestand waar de percentages heen moeten.

Ik heb alleen nog een problemo: Het programmatje wat ik heb geschreven vreet CPU cycles. Dat moet anders kunnen.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 15:57
Ah, ik denk dat dat inderdaad de beste methode is (iets schrijven dat min of meer 'cat' vervangt)

Als je programma CPU-cycles vreet, enig idee hoe dat komt? Je leest de file toch niet byte voor byte o.i.d. he ? Probeer blokken te lezen van 4K ofzoiets, dat lijkt me een redelijke grootte.

Trouwens nog een tip: schrijf die percentages niet naar een file, maar naar stderr! Dus de te decomprimeren data gaat naar stdout, en de 'extra info' die jij maakt naar stderr.

Dan kan jouw installer stderr afvangen, en tar merkt daar helemaal niks van. Hoef je ook geen file aan te maken (met alle kansen dat dat fout gaat vandien, erg irri in een installer)

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Op dinsdag 02 april 2002 14:07 schreef Wilke het volgende:
Ah, ik denk dat dat inderdaad de beste methode is (iets schrijven dat min of meer 'cat' vervangt)

Als je programma CPU-cycles vreet, enig idee hoe dat komt? Je leest de file toch niet byte voor byte o.i.d. he ? Probeer blokken te lezen van 4K ofzoiets, dat lijkt me een redelijke grootte.

Trouwens nog een tip: schrijf die percentages niet naar een file, maar naar stderr! Dus de te decomprimeren data gaat naar stdout, en de 'extra info' die jij maakt naar stderr.

Dan kan jouw installer stderr afvangen, en tar merkt daar helemaal niks van. Hoef je ook geen file aan te maken (met alle kansen dat dat fout gaat vandien, erg irri in een installer)
Hij vreette cpu tijd omdat ik de blockgrootte inderdaad te klein was. 1024 bytes was het. Er zat ook nog iets fout in het berekenen van het percentage. ('t was 3 uur snachts, dan krijg je dat soort fouten :9)

Schrijven naar stderr had ook gekunt, maar dit is net zo makkelijk. Dan kan je tar ook nog op een andere tty laten draaien ofzo.

Maar nu werkt het iig helemaal perfect. :7

  • Wilke
  • Registratie: December 2000
  • Laatst online: 15:57
Op dinsdag 02 april 2002 16:28 schreef metaal het volgende:
Maar nu werkt het iig helemaal perfect. :7
Koel, kun je de source hier misschien posten (indien niet te lang)? Lijkt me ook wel leuk om te hebben namelijk.

Als het tenminste niet voor je werk is o.i.d. ...

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Ow de source is niet zo moeilijk. Is nog wel een beetje dirty maar ik ga em wat beter maken als ik tijd heb.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define BUFSIZE     65536



char* in_path;
char* out_path;


void parse_argv(int argc, char* argv[]) {
    if(argc != 3) {
        fprintf(stderr, "Verkeerd aantal argumenten\n");
        exit(-1);
    }

    in_path = argv[1];
    out_path = argv[2];
}


int main(int argc, char* argv[]) {
    int in_fd;
    int out_fd;
    long len, read_len=0, total_len;
    int prc, old_prc=0;
    int buf[BUFSIZE];

    struct stat statbuf;


    parse_argv(argc, argv);

    if((in_fd = open(in_path, O_RDONLY)) < 0) {
        perror("input file");
        exit(-1);
    }

    if((out_fd = open(out_path, O_WRONLY)) < 0) {
        perror("output file");
        exit(-1);
    }

    stat(in_path, &statbuf);
    total_len = statbuf.st_size;


    while(len = read(in_fd, buf, BUFSIZE)) {
        read_len += len;
        write(fileno(stdout), buf, len);
        prc = ((float)read_len / total_len) * 100;
        if(old_prc != prc) {
            dprintf(out_fd, "%d\n", prc);
            old_prc = prc;
        }
    }

    close(in_fd);
    close(out_fd);
}

De buffersize kan nog wel wat groter en misschien ook nog wel wat checks dat je niet naar een directory probeert te schrijven enzo.

edit:

Nog ff wat instructies:
• Maak eerst een fifo aan met 'mkfifo mijnfifo'
• Start het tar proces met 'counter bestand.tar mijnfifo | tar -x'
• Op een andere console start je bijvoorbeeld 'cat mijnfifo | whiptail --gauge "Bezig met uitpakken" 20 70 0'

Het zou natuurlijk ook nog op een aantal andere manieren kunnen maar dit werkt voor mijn geval het lekkerst.

Verwijderd

euh even tussen door de mega script goeroe's

maar kan je niet het aantal files opvragen en en de percentage berekenen bij elke file die tar uitpakt dan heb je niet de bestands groote dus het zal wat schokken
maar moet simpel zijn ik weet niet hoe mooi je het wil hebben nl ...
en hoe groot dat tar bestand is.

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Tja, dit werkt nou. De progres bar wordt nu elke keer 'bijgewerkt' als er een blok gegevens wordt ingelezen, dus hij loopt over de hele duur netjes geleidelijk. Ik heb em vanmiddag getest op een tar-file van 590MB. Werkt prima. Het programmatje vraagt nauwelijks processorcapaciteit meer. Minder dan cat zou gebruiken in zo'n soort actie zelfs *D.
Pagina: 1