Repository 32bit  Forum
Repository 64bit  Wiki

[bash] Barretta di avanzamento progressivo

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » mer ago 06, 2008 16:17

pv == Pipe Viewer, Current version 1.1.4

[url]
http://www.ivarch.com/programs/pv.shtml
[/url]
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » lun dic 07, 2009 14:49

In effetti, non essendo il backup di un volume un ciclo interattivo, non trovo il modo di agganciare il printf ad un qualcosa che mi permetta di avanzare.
Qui quello che sono riuscito a mettere insieme cercando sul web. Funziona, ma avanza di un punto percentuale ogni backup completo (quindi 100 backup di un paio di min per completare la barra ..)

Codice: Seleziona tutto
#! /bin/bash

COLNNE=$(stty -a | tr -s ';' '\n' | grep "column" | sed s/'[^[:digit:]]'//g)
BARMIN=0
BARMAX=100
BARSYM="="
SPAZIO=8

GetBarra() {
   BARVAL=$1
   BARCOL=$(($COLNNE-$SPAZIO))
   BARNUM=$((($BARVAL*$BARCOL)/($BARMAX-$BARMIN)))
   for((j=0; j<$BARNUM; j++)); do
      AVANZA="$AVANZA$BARSYM"
   done
   PERCEN=$(printf " %3d%%  " $BARVAL)
   echo -ne "$PERCEN$AVANZA\r"
}

for((i=$BARMIN; i<=$BARMAX; i++)); do
   echo -ne "$(GetBarra $i)\r"
   # dar -c $DISCO -R $DATIN -w -y ...
done
echo -e "\n"


Dove pecca la mia incompetenza?
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » lun dic 07, 2009 15:45

for((j=0; j<$BARNUM; j++)); do
AVANZA="$AVANZA$BARSYM"
done
PERCEN=$(printf " %3d%% " $BARVAL)
echo -ne "$PERCEN$AVANZA\r"

metti

for((j=0; j<$BARNUM; j++)); do
AVANZA="$AVANZA$BARSYM"
PERCEN=$(printf " %3d%% " $BARVAL)
echo -ne "$PERCEN$AVANZA\r"
done

magari erro, ma cosi` occhio e croce ...
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » mer dic 09, 2009 11:08

@mario

eheheh.. l'avevo già provata questa cosa, ma così non gira per niente..
ho provato anche a fargli leggere un array fittizzio (tipo, appunto, "pv", che, se non gli dai in pasto un file con un ingombro definito, inserisci opzione -s(ize-dell'ipotetico-file) 25m(ega) per fornirgli un tot di bytes da processare per arrivare al 100%: solo così si mette in funzione).
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » mer dic 09, 2009 11:22

@mario

altra soluzione che ho trovato (in varie forme) è quella di creare un file in tmp +/- della stessa grandezza del volume da processare e fargli leggere il size di quello per quanto riguarda avanzamento, percentuale ed ETA. ma mi sembra assurda la cosa: se hai un volume di un paio di GB, deve processare quello vero + leggere quello fittizzio.. piuttosto maccheronico e poco elegante.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » mer dic 09, 2009 18:23

kanzy ha scritto:@mario

eheheh.. l'avevo già provata questa cosa, ma così non gira per niente..
ho provato anche a fargli leggere un array fittizzio (tipo, appunto, "pv", che, se non gli dai in pasto un file con un ingombro definito, inserisci opzione -s(ize-dell'ipotetico-file) 25m(ega) per fornirgli un tot di bytes da processare per arrivare al 100%: solo così si mette in funzione).

Codice: Seleziona tutto
#! /bin/bash
 
COLNNE=160
BARMIN=0
BARMAX=100
BARSYM="="
SPAZIO=60

GetBarra() {
   BARVAL=$1
      BARCOL=$(($COLNNE-$SPAZIO))
 BARNUM=$((($BARVAL*$BARCOL)/($BARMAX-$BARMIN)))   
    for((j=0; j<$BARNUM; j++)); do   
  AVANZA="$AVANZA$BARSYM"
PERCEN=$(printf " %3d%%  " $BARVAL)
   echo -ne "$PERCEN$AVANZA\r"
   done
   }
   
   for((i=$BARMIN; i<=$BARMAX; i++)); do
      echo -e "$(GetBarra $i)"
 # dar -c $DISCO -R $DATIN -w -y ...
 done
 echo -e "\n"



prova questa variante per sola bar ...
Sul mio schermo 19" perfetto.

Scusa l'incollonamento errato,
copiare dal forum sul nvi in un tty,
e poi viceversa ...
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » gio dic 10, 2009 12:44

@mario

provato, ma non funge.
anche il mio script postato sopra funziona benissimo a livello bar.
ma quando gli dai in pasto il backup (portato a termine correttamente) la barra avanza solo di 1 simbolo (che è giusto, trattandosi di un solo processo terminato..).
questo è il busillis (che non riesco a risolvere per poca dimestichezza con le funzioni più evolute della shell).

pv, che potrebbe essere una soluzione (ma, anche qui, non riesco ad applicarla), presuppone l'installazione del binario sulla macchina.
se sei altrove, non serve. dunque, sevirebbe (a questo punto solo per crucca cocciutaggine) l'implementazione nello script, che stà sulla chiavetta.

intanto grazie mario per il tuo interessamento a questa cosa (che, come vedi, si trascina da molto tempo), ma penso che trovata una soluzione accettabile la cosa possa interessare molti, vista la valanga di post sull'argomento trovati in rete.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » gio dic 10, 2009 15:09

kanzy ha scritto:@mario

provato, ma non funge.
anche il mio script postato sopra funziona benissimo a livello bar.
ma quando gli dai in pasto il backup (portato a termine correttamente) la barra avanza solo di 1 simbolo (che è giusto, trattandosi di un solo processo terminato..).
questo è il busillis (che non riesco a risolvere per poca dimestichezza con le funzioni più evolute della shell).

pv, che potrebbe essere una soluzione (ma, anche qui, non riesco ad applicarla), presuppone l'installazione del binario sulla macchina.
se sei altrove, non serve. dunque, sevirebbe (a questo punto solo per crucca cocciutaggine) l'implementazione nello script, che stà sulla chiavetta.

intanto grazie mario per il tuo interessamento a questa cosa (che, come vedi, si trascina da molto tempo), ma penso che trovata una soluzione accettabile la cosa possa interessare molti, vista la valanga di post sull'argomento trovati in rete.


Il problema te lo crei tu stesso con
dar -c $DISCO -R $DATIN -w -y

leggi bene la man page di dar(1):

-v, --verbose[=s[kipped]] verbose output. --verbose and --verbose=skipped are independent. --verbose=skipped displays the files being excluded by filters, while --verbose display actions under process.

poi

-y[level], --bzip2[=level] compresses using bzip2 algorithm. See -z above for usage details.

Userei in ogni caso -y9

Tu ora ricevi solo "the final statistics report", quindi barra con 1.
Se metti a dar anche l'opzione -q, nemmeno quello.

Per curiosita` ho scaricato e provato dar-2.3.9, sinceramente non mi serve.
L'ho provato con /root/dar-2.3.9 verso /tmp/dar, impiega circa 20 secondi,
con -v ogni file da un messaggio, interpretabile dalla shell.

Lascio a te il divertimento di trovare come.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » gio dic 10, 2009 17:13

@mario

beh.. dar lo uso da anni ed è un mio sfizio.. perchè, se necessario (ed a volte lo è per questioni di trasportabilità od invio a remoto) è in grado di criptare il tutto solo aggiungendo l'opzione '-K:'. Per il resto vale qualunque altro attrezzo. C'è da dire, inoltre, che la riga che vedi commentata è solo la punta dell'iceberg dello script di backup, come tu, penso, avrai certamente capito vedendo le variabili processate ed i puntini di sospensione :D . Le altre osservazioni che fai sono, come sempre, puntuali ma, naturalmente, se non usi il comando non puoi sapere che di default -y=-y9 (cioè, solo se vuoi meno compressione lo devi specificare..). Il report a me serve per conoscere il nr dei files e vedere le differenze con quello precedente, dunque vorrei mantenerlo. L'opzione -w sovrascrive i precedenti, cosa voluta in quanto il backup non è differenziale e può succedere di effettuarlo 2 volte nella stessa data dunque di doverlo sovrascrivere. Interessante il fatto - che non avevo notato - che -v da un messaggio per *ogni* file. Quindi pensi di agganciare le iterazioni di 'for' ad ogni output di -v?.. posso provare, magari con un >/dev/null per evitare 2000 righe.. poi ti dico.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » gio dic 10, 2009 18:28

Nella sorgente di dar
dar-2.3.9/doc/samples
esiste un esempio
JH-dar-make_user_backup.sh
che forse potrebbe interessarti.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » ven dic 11, 2009 11:42

@mario
thnx :D
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » ven dic 11, 2009 15:21

@mario

questo lo script di partenza (raw) a cui applicare la barretta:

Codice: Seleziona tutto
#!/bin/bash
#
# /usr/local/sbin/datbak
# cooked by kanzy [ kooonzy (aT) gmail (d0T) com ]
#

# Avviso
if [ "$UID" != "0" ]; then
   echo -e "\n `basename $0` può essere eseguito solo da root.\n"
   exit -1
fi

# Uso
if [ "$1" = "" -o "$1" = "--help" -o "$1" = "-h" ]; then
    echo -e " Questo script effettua il backup di una directory sul secondo HD,"
    echo -e " oppure su una memoria USB. Deve essere installato il comando DAR."
    echo -e " Uso: `basename $0` [disco | stick]\n"
    exit -1
fi

# Directory sorgente predefinita
#SORGE="/home/$USER/"
SORGE="/mnt/house/"

echo -ne "\n Origine dati [Invio per $SORGE]: "
read DATIN
if [ ! -s "$DATIN" ]; then DATIN="$SORGE"; fi

# Directory destinazione predefinita
#TARGET1="/mnt/hd2/$(basename "$DATIN")-$(date +%d-%m-%y)"
#TARGET2="/media/disk/$(basename "$DATIN")-$(date +%d-%m-%y)"
TARGET1="/mnt/stiva/data/$(basename "$DATIN")-$(date +%d-%m-%y)"
TARGET2="/media/Cruzer/data/$(basename "$DATIN")-$(date +%d-%m-%y)"

BackUp() {
    echo -e "\n Backup in esecuzione, attendere... "
   dar -c $DISCO -R $DATIN -w -y -m 256 -Z "*.jpg" -Z "*.png"

    echo -ne "\n Verifica del backup in corso..."
    if dar -t $DISCO > /dev/null ; then
        echo -e "\t\t[ \E[1;32mOK\E[0m ]"
        echo -e "\n Backup effettuato il $(date +%d-%m-%y) alle ore $(date +%T) dall'utente $(whoami)\n";
    else
        echo -e "\t\t[ \E[1;31mKO\E[0m ]"
        echo -e "\n La verifica riscontra errori in uno o più files del backup.\n"
    fi
    exit
}

# HD2 backup
if [ "$1" = "disco" ]; then
   echo -ne "\n Destinazione HD2 [Invio per $TARGET1]: "
    read DISCO
    if [ ! -s "$DISCO" ]; then DISCO="$TARGET1"; fi
   BackUp
fi

# USB backup
if [ "$1" = "stick" ]; then
    echo -ne "\n Destinazione USB [Invio per $TARGET2]: "
    read DISCO
    if [ ! -s "$DISCO" ]; then DISCO="$TARGET2"; fi
    BackUp
fi
# EOF

l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » mar dic 29, 2009 22:51

Ecco qui lo scriptino finito (e fine a se stesso..) della barretta di avanzamento:

Codice: Seleziona tutto
#!/bin/bash

Barra() {
   BARCOL=$(stty -a | head -n 1 | awk '{print $7}' | tr -s ';' '\n')
   BARDIM=$(( $1 * ($BARCOL -10) / 100 ))
   for((j=0; j<$BARDIM; j++)); do
      BARSYM="$BARSYM="
      XCENTO=$(printf " %3d%% " $1)
      echo -ne "$XCENTO $BARSYM\r"
   done
   return
}

for((i=0; i<=100; i++)); do   
   echo -ne "$(Barra $i)\r"
done
echo -e "\n"



Adesso bisognerebbe farlo funzionare nello script che segue (finito):

Codice: Seleziona tutto
#!/bin/bash
#
#  datbkp - Script per effettuare il backup di una directory su di un
#+ secondo HD o su di una memoria USB. E' necessario il comando DAR.
#
#====== Configurazione ===============================================
# Directory origine
#SORGE="/home/$USER/"
SORGE="/mnt/house/"
# Subdirectory origine da escludere
NODIR="lost+found"
# Directory destinazione
#TARGET1="/mnt/hd2/$USER-$(date +%d-%m-%y)"
#TARGET2="/media/disk/$USER-$(date +%d-%m-%y)"
TARGET1="/mnt/stiva/data/house-$(date +%d-%m-%y)"
TARGET2="/media/Cruzer/data/house-$(date +%d-%m-%y)"
#=====================================================================

ARGS=('--dsk' '-h' '--help' '--stk')

BackUp() {
    echo -e "\n Backup in esecuzione, attendere... "
   dar -c $DISCO -R $DATINP -P $NODIR -w -y -m 256 -Z "*.jpg" -Z "*.png"
    echo -ne "\n Verifica del backup in corso..."
    if dar -t $DISCO > /dev/null; then
        echo -e "\t\t\t[ \E[1;32mOK\E[0m ]"
        echo -e "\n Backup effettuato il $(date +%d-%m-%y) alle ore $(date +%T) dall'utente $(whoami).\n";
    else
        echo -ne "\n La verifica segnala errori in uno o più processi del backup."
        echo -e "\t [ \E[1;31mKO\E[0m ]\n"
    fi
    return
}

Dati() {
   echo -ne "\n Directory origine [Invio per $SORGE]: "
   read DATINP
   if [ -z "$DATINP" ]; then DATINP="$SORGE"; fi   
   return
}

Uso() {
    echo -e "\n Questo script effettua il backup di una directory sul secondo HD,"
    echo -e " oppure su una memoria USB. Deve essere installato il comando DAR."
    echo -e " Lo script chiede una directory sorgente ed una di destinazione."
    echo -e " Predefinite: input /home/user, output /mnt/hd2 | /media/disk."
    echo -e " Uso: `basename $0` <opzione>\n"
    echo -e " Opzioni:"
    echo -e "\t--dsk \tbackup su disco rigido;"
    echo -e "\t--stk \tbackup su memoria USB;"
    echo -e "\t--help \tvisualizza queste informazioni ed esce.\n"
    return
}

# HD2 backup
if [ "$1" = "${ARGS[0]}" ]; then
   Dati
   echo -ne "\n Destinazione HD2 [Invio per $TARGET1]: "
   read DISCO
   if [ -z "$DISCO" ]; then DISCO="$TARGET1"; fi
   BackUp
   exit
fi

# USB backup
if [ "$1" = "${ARGS[3]}" ]; then
   Dati
   echo -ne "\n Destinazione USB [Invio per $TARGET2]: "
   read DISCO
   if [ -z "$DISCO" ]; then DISCO="$TARGET2"; fi
   BackUp
   exit
fi

# Controlli
if [ $UID -ne 0 ]; then
   echo -e "\n `basename $0` va eseguito da root.\n"
   exit
elif [ -z "$1" ]; then
   Uso
   exit
elif [ "$1" = "${ARGS[1]}" -o "$1" = "${ARGS[2]}" ]; then
   Uso
   exit
elif [ "$1" != "${ARGS[0]}" -o "$1" != "${ARGS[3]}" ]; then
   echo -e " Opzione '$1' sconosciuta."
   echo -e " `basename $0` --help per uso.\n"
   exit
fi

# EOF
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » mer dic 30, 2009 17:25

kanzy ha scritto:Ecco qui lo scriptino finito (e fine a se stesso..) della barretta di avanzamento:
...
Adesso bisognerebbe farlo funzionare nello script che segue (finito):
...

Se leggi la man page di fsck(8):
-C [ fd ] Display completion/progress bars for those filesystem checkers (currently only for ext2 and ext3) which support them.

Quindi dovrebbe essere incorporato in dar(1) IMVHO, forse richiederlo al suo autore ...
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » mer dic 30, 2009 19:09

@mario

come mi avevi già segnalato in precedenza, avevo dato un occhio a fsck per trovare uno stralcio di codice interessante, ma per adesso (per il tempo che gli ho dedicato..) non ho trovato niente. Guarderò meglio il punto che mi hai indicato. Ho trovato, invece, di più nel codice di slackpkg (/usr/libexec/slackpkg), ma le righe in questione (subito all'inizio) non mi sembra possano adattarsi alla situazione. Vedremo a gennaio.. intanto tanti cari auguri di buon anno a te, a tutti i partecipanti al forum ed allo staff =D> : 2TB di vita passioni esperienze indimenticabili a tutti per un anno nuovo che *deve* essere assolutamente migliore! \:D/
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Precedente

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron