Cuando uso zip, ¿cómo puedo mostrar el progreso general sin inundar la línea de comando?

25

Una barra de progreso de longitud fija, un conteo de archivos o bytes, o mejor aún, un temporizador que muestre el tiempo restante estimado sería ideal.

zipEl comportamiento estándar parece ser imprimir una línea para cada archivo procesado, pero no quiero que esa información se sobrecargue cuando comprimo miles de archivos. Quiero una estimación de cuánto tiempo llevará.

Probé la opción -q( --quiet) en combinación con -dg( --display-globaldots) pero eso solo inunda stdout con múltiples líneas de puntos y no da ninguna indicación útil.

También intenté -qdgds 10mcomo se menciona en la página del manual, pero obtuve el mismo resultado.

Luego probé -db( --display-bytes) y -dc( --display-counts) pero no parece haber una opción global, por lo que nuevamente la imprime para cada nombre de archivo.

Por último, lo probé junto con -qlike -qdbdc, pero eso simplemente no genera nada.

Curiosamente, encontré una página de manual en el sitio info-zip que menciona una opción -de( --display-est-to-go) que debería "Mostrar una estimación del tiempo para finalizar la operación de archivo".

Eso suena exactamente como lo que quiero, pero el problema es que mi versión de zipno tiene esa característica. Estoy usando Ubuntu 14.04.1 64bit, bash-4.3.30 (1) y zip-3.00. Según Wikipedia, esta es la última versión estable de zip.

Hay versiones beta inéditas en la página info-zip sourceforge, pero prefiero no confiar mis datos a una versión beta.

error
fuente
Registre el resultado en un archivo y úselo para proporcionar información de alto nivel tee. Antes de comenzar el zip, haga un recuento total de los archivos (con lso find -type f) y mientras está comprimiendo, lea el archivo de registro para ver la cantidad de líneas de archivos procesados ​​que ya tiene (con greplas líneas correctas para mirar y wc -llas líneas contar), por lo que su información de alto nivel mostrará algo así como "234/76438 archivos procesados";
Acuario Power
puede calcular el tiempo considerando el tamaño total de los archivos y verificando el tamaño de los que ya se procesaron; pero ... incluso los archivos con el mismo tamaño tardan un tiempo diferente en procesarse, por lo que siempre será una conjetura ...
Aquarius Power
No sé si puede usar stdin al hacer archivos ZIP, pero si gzip está bien, puede hacer algo comopv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Respuestas:

11

zippuede comprimir datos a la salida estándar. Por lo tanto, puede combinarlo con otras herramientas como pv:

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

Elimine una de las -bepopciones según su conveniencia.

pedroapero
fuente
¡Gracias por esto! Hago esto en mi mac (brew install pv, brew install coreutils y reemplazo du con gdu).
Jeff
6

Si estás de acuerdo con usar 7z:

7z a output.zip folder/

Esto te dará una barra de progreso como esta:

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  
qwr
fuente
2

He usado con éxito lo siguiente:

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

Y esto se explica a continuación:

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

comprima recursivamente en el archivo [target_zip] el [folder_to_zip] redireccionando stderr a stdout. Tenga en cuenta que stderr contendrá una línea para cada archivo y directorio que se procese.

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

canaliza en pv las líneas con los nombres de los archivos a medida que salen de zip. El pv se opera en modo de línea (el conteo de progreso basado en líneas y tamaño también está en el número de líneas que se esperan; vea la opción de la página man PV -l ).

El tamaño total de las líneas que se esperan se recopila enumerando recursivamente (ls) la [folder_to_zip] y contando las líneas que comienzan con '-' o 'd', es decir, todos los archivos y directorios (recuerde que los directorios se enumeran comenzando con '/') .

Lo anterior proporciona un porcentaje preciso de finalización a medida que se alcanza el 100% cuando se han procesado todos los archivos y directorios.

El problema con la respuesta de pedroapero es que el progreso se calcula sobre el número de bytes procesados ​​(comprimidos) sobre el número total de bytes a procesar (sin comprimir). Como resultado, el proceso se completará en alrededor del 30% (dependiendo de la tasa de compresión).

Lefteris
fuente