Quando eu uso o zip, como posso exibir o progresso geral sem inundar a linha de comando?

21

Uma barra de progresso de tamanho fixo, uma contagem de arquivos ou bytes, ou melhor ainda, um cronômetro mostrando o tempo estimado restante seria ideal.

O comportamento padrão do

zip parece ser imprimir uma linha para cada arquivo processado, mas eu não quero essa sobrecarga de informações quando eu compactar milhares de arquivos. Eu quero uma estimativa de quanto tempo vai demorar.

Eu tentei a opção -q ( --quiet ) em combinação com -dg ( --display-globaldots ), mas isso apenas enche stdout com várias linhas de pontos e não fornece nenhuma indicação útil.

Eu também tentei -qdgds 10m como mencionado na página man, mas obtive o mesmo resultado.

Eu então tentei -db ( --display-bytes ) e -dc ( --display-counts ), mas parece não haver uma opção global, então ela imprime novamente para cada nome de arquivo.

Por fim, eu tentei isso junto com -q como -qdbdc , mas isso não produz nada.

Curiosamente, encontrei uma página man no site info-zip que menciona uma opção -de ( --display-est-to-go ) que deveria "Exibir uma estimativa do tempo para concluir a operação de arquivamento".

Isso soa exatamente como eu quero, mas o problema é que minha versão de zip não tem esse recurso. Estou usando o Ubuntu 14.04.1 64bit, bash-4.3.30 (1) e zip-3.00. Segundo a Wikipedia, este é o último lançamento estável do zip.

Existem versões beta não lançadas na página do sourceforge info-zip, mas prefiro não confiar meus dados a uma versão beta.

    
por bug 17.01.2015 / 14:48

3 respostas

8

zip pode compactar dados para a saída padrão. Assim, você pode combiná-lo com outras ferramentas como pv :

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

Remova uma das opções -bep conforme sua conveniência.

    
por 16.09.2015 / 12:06
2

Se você está bem com o 7z:

7z a -r output.zip folder/

Isso lhe dará uma barra de progresso 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  
    
por 26.06.2018 / 21:09
1

Eu usei com sucesso o seguinte:

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

E isso é explicado abaixo:

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

zip recursivamente no arquivo [target_zip] o [folder_to_zip] redirecionando o stderr para stdout. Note que stderr conterá uma linha para cada arquivo e diretório sendo processado.

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

canalize para pv as linhas com os nomes dos arquivos conforme eles estão sendo emitidos pelo zip. pv é operado em modo de linha (contando o progresso baseado em linhas e tamanho também está em número de linhas para esperar - veja página de manual de PV - l opção ).

O tamanho total das linhas a serem esperadas é reunido listando recursivamente (ls) o [folder_to_zip] e contando as linhas que começam com '-' ou 'd' ou seja, todos os arquivos e diretórios (lembre-se diretórios são listados a partir com '/') .

O texto acima fornece uma porcentagem exata de conclusão, pois o 100% é atingido quando todos os arquivos e diretórios são processados.

O problema com a resposta do pedroapero é que o progresso é calculado no número de bytes processados (compactados) sobre o número total de bytes a serem processados (não compactados). Como resultado, o processo será concluído em torno de 30% (dependendo da taxa de compactação).

    
por 20.03.2018 / 18:44