[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.
Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

pv == Pipe Viewer, Current version 1.1.4


http://www.ivarch.com/programs/pv.shtml

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

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 ...

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

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 ...

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

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.

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

Nella sorgente di dar
dar-2.3.9/doc/samples
esiste un esempio
JH-dar-make_user_backup.sh
che forse potrebbe interessarti.

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@mario
thnx :D
l'uomo ha bisogno di cibo rifugio e storie

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [bash] Barretta di avanzamento progressivo

Messaggio da Mario Vanoni »

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 ...

kanzy
Linux 2.x
Linux 2.x
Messaggi: 210
Iscritto il: sab 10 mag 2008, 15:02
Slackware: 14.2

Re: [bash] Barretta di avanzamento progressivo

Messaggio da kanzy »

@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

Rispondi