Quando utilizzo zip, come posso visualizzare l'avanzamento complessivo senza inondare la riga di comando?


25

Una barra di avanzamento a lunghezza fissa, un conteggio di file o byte, o meglio un timer che mostri il tempo rimanente stimato sarebbe l'ideale.

zipIl comportamento standard sembra essere quello di stampare una riga per ogni file elaborato, ma non voglio quel sovraccarico di informazioni quando comprimo migliaia di file. Voglio una stima di quanto tempo ci vorrà.

Ho provato l' opzione -q( --quiet) in combinazione con -dg( --display-globaldots) ma questo inonda lo stdout con più linee di punti e non fornisce indicazioni utili.

Ho anche provato -qdgds 10mcome menzionato nella pagina man, ma ho ottenuto lo stesso risultato.

Ho quindi provato -db( --display-bytes) e -dc( --display-counts) ma non sembra esserci un'opzione globale, quindi la stampa nuovamente per ogni nome file.

Infine, l'ho provato insieme a -qlike -qdbdc, ma questo non ha prodotto nulla.

Stranamente, ho trovato una pagina man sul sito di zip che menziona un'opzione -de( --display-est-to-go) che dovrebbe "Visualizzare una stima del tempo necessario per completare l'operazione di archiviazione".

Sembra esattamente quello che voglio, ma il problema è che la mia versione di zipnon ha quella funzione. Sto usando Ubuntu 14.04.1 64 bit, bash-4.3.30 (1) e zip-3.00. Secondo Wikipedia, questa è l'ultima versione stabile di zip.

Esistono versioni beta inedite nella pagina sourceforge di info-zip, ma preferirei non affidare i miei dati a una versione beta.


Registra l'output in un file e usalo per fornire informazioni di alto livello tee. Prima di avviare zip, fare un conteggio totale dei file (con lso find -type f) e mentre è zippato, leggere il file di registro per il numero di linee di file elaborati che ha già (con grepper le linee giuste da guardare e wc -lper le linee conta), quindi le tue informazioni di alto livello mostreranno qualcosa come "234/76438 file elaborati";
Aquarius Power il

puoi lavorare sui tempi considerando la dimensione totale dei file e controllando la dimensione di quelli già elaborati; ma ... anche i file con le stesse dimensioni richiedono tempi diversi per essere elaborati, quindi sarà sempre un'ipotesi selvaggia ...
Aquarius Power

Non so se puoi usare stdin durante la creazione di file ZIP, ma se gzip va bene, puoi fare qualcosa del generepv /path/to/file | gzip > /path/to/file.gz
DopeGhoti,

Risposte:


11

zippuò comprimere i dati in output standard. Quindi, puoi combinarlo con altri strumenti come pv:

zip -qr - [folder] | pv -bep -s $(du -bs [folder] | awk '{print $1}') > [file.zip]

Rimuovi una delle -bepopzioni per comodità.


Grazie per questo! Lo faccio sul mio mac (brew install pv, brew install coreutils e sostituisco du con gdu).
Jeff,

6

Se stai bene usando 7z:

7z a output.zip folder/

Questo ti darà una barra di avanzamento come questa:

Open archive: test.zip
--
Path = test.zip
Type = zip
Physical Size = 232039663

Scanning the drive:
3 folders, 2401 files, 238122225 bytes (228 MiB)

Updating archive: test.zip

Items to compress: 2404

 16% 279 U folder/file.txt  

2

Ho usato con successo quanto segue:

zip -r [target_zip] [folder_to_zip] 2>&1 | 
pv -lep -s $(ls -Rl1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null

E questo è spiegato di seguito:

zip -r [target_zip] [folder_to_zip] 2> & 1 |

zip ricorsivamente nel file [target_zip] il [folder_to_zip] reindirizzando stderr a stdout. Nota che stderr conterrà una riga per ogni file e directory in elaborazione.

pv -lep -s $ (ls -Ral1 [folder_to_zip] | egrep -c '^ [- /]')> / dev / null

reindirizza in pv le linee con i nomi dei file mentre vengono emessi da zip. pv è gestito in modalità linea (il conteggio dei progressi in base a linee e dimensioni è anche in numero di linee da aspettarsi - vedi pagina man PV -l opzione ).

La dimensione totale delle righe attese viene raccolta elencando in modo ricorsivo (ls) il [folder_to_zip] e contando le righe che iniziano con '-' o 'd', cioè tutti i file e le directory (ricordate che le directory sono elencate che iniziano con '/') .

Quanto sopra fornisce una percentuale accurata di completamento quando viene raggiunto il 100% quando tutti i file e le directory sono stati elaborati.

Il problema con la risposta di pedroapero è che i progressi sono calcolati sul numero di byte elaborati (compressi) sul numero totale di byte da elaborare (non compressi). Di conseguenza, il processo verrà completato a circa il 30% (a seconda del tasso di compressione).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.