[Bash] wget + pv: barra di avanzamento download

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.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3805
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 15.0
Kernel: 5.15.38
Desktop: dwm

[Bash] wget + pv: barra di avanzamento download

Messaggio da joe »

Apro questo nuovo messaggio per continuare un argomento di cui si era già parlato in altro topic, ma la non era il tema principale.
Ecco il link a quella discussione: viewtopic.php?f=20&t=33902&p=298679&sid ... 35#p298679

Praticamente volevo utilizzare wget in uno script, adattandone però un po' meglio l'output in modo da visualizzarne solamente la barra discorrimento senza tutta la sessione di dialogo col server. Alla fine era venuto fuori che si può fare con un programma chiamato "pv". Ecco come si può usare:

Codice: Seleziona tutto

wget -q -O - "$URL" | pv -s $SIZE> ${filescaricato}
In pratica si fa in modo che wget (in modalità silente con l'opzione "-q") sputi il file in scaricamento sullo stout.
Poi si redirige con un pipe l'output (cioè il file che si sta scaricando) a "pv" specificando con l'opzione "-s" la dimensione totale del file ($SIZE va definita preventivamente, o amano o usando per esempio wget in spider mode, vedi topic linkato all'inizio).
Infine l'output di pv (che rappresenta ancora i dati in download) viene inviato al file locale di destinazione.

Qual'è il problema?
La funzione di resume che mi è indispensabile se ne va a donnine. Sì perchè aggiungendo l'opzione "-c" di wget al comando sopra riportato si avrebbe qualcosa del genere:

Codice: Seleziona tutto

wget -c -q -O - "$URL" | pv -s $SIZE> ${filescaricato}
Ma non funzionerebbe:
- infatti wget confronta i dati remoti con lo "stout" e non con un file.
- noto anche che la redirezione finale in ogni caso andrebbe sostituita con ">>", ma quello è un altro discorso che non elimina il problema.

Servirebbe insomma un modo per forzare wget a utilizzare come termine di paragone col file remoto, il file locale parzioalmente scaricato e allo stesso tempo istruirlo in modo che sputi i nuovi dati non direttamente sul file locale, ma sullo stdout in modo da poter sfruttare "pv".
Non conoscendo bene pv, ipotizzo un altro punto di vista:
- mettiamo di avere un file che sta crescendo (pensando al file locale che "ospiterà" i dati in download
- sappiamo quale dovrà essere la sua dimensione totale $SIZE
Ecco, in tale ottica servirebbe un modo per sfruttare "pv" a "monitorare quel file" in modo che ne rappresenti la crescita con la sua barra di avanzamento. Non so se mi sono spiegato.

Trovato il modo allora si potrebbe usare wget normalmente:

Codice: Seleziona tutto

wget -c -O ${filescaricato} "$URL"
E poi lavorare sul file scaricato che evidentemente sta crescendo, non so... magari trovando un modo per prenderlo in intput e risputarlo sullo stout per poi redirigerlo a pv...
Però bisognerebbe prendere in input non la parte parzialmente scaricata e basta, cioè bisognerebbe prendere in input il "flusso" di dati che stanno accrescendo il file.
Probabilmente sono stato un po' aggrovigliato nel rendere l'idea, spero sia passato il senso della questione.

Avete idee?

Rispondi