[bash] Barretta di avanzamento progressivo
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.
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.
-
- 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
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 ..)
Dove pecca la mia incompetenza?
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"
l'uomo ha bisogno di cibo rifugio e storie
-
- 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
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 ...
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 ...
Re: [bash] Barretta di avanzamento progressivo
@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).
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
Re: [bash] Barretta di avanzamento progressivo
@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.
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
-
- 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
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"
Sul mio schermo 19" perfetto.
Scusa l'incollonamento errato,
copiare dal forum sul nvi in un tty,
e poi viceversa ...
Re: [bash] Barretta di avanzamento progressivo
@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.
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
-
- 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
Il problema te lo crei tu stesso conkanzy 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.
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.
Re: [bash] Barretta di avanzamento progressivo
@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 . 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.
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 . 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
-
- 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
Nella sorgente di dar
dar-2.3.9/doc/samples
esiste un esempio
JH-dar-make_user_backup.sh
che forse potrebbe interessarti.
dar-2.3.9/doc/samples
esiste un esempio
JH-dar-make_user_backup.sh
che forse potrebbe interessarti.
Re: [bash] Barretta di avanzamento progressivo
@mario
thnx
thnx
l'uomo ha bisogno di cibo rifugio e storie
Re: [bash] Barretta di avanzamento progressivo
@mario
questo lo script di partenza (raw) a cui applicare la barretta:
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
Re: [bash] Barretta di avanzamento progressivo
Ecco qui lo scriptino finito (e fine a se stesso..) della barretta di avanzamento:
Adesso bisognerebbe farlo funzionare nello script che segue (finito):
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"
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
-
- 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
Se leggi la man page di fsck(8):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):
...
-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 ...
Re: [bash] Barretta di avanzamento progressivo
@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 : 2TB di vita passioni esperienze indimenticabili a tutti per un anno nuovo che *deve* essere assolutamente migliore!
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 : 2TB di vita passioni esperienze indimenticabili a tutti per un anno nuovo che *deve* essere assolutamente migliore!
l'uomo ha bisogno di cibo rifugio e storie