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

25

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 o ideal.

zipO comportamento padrão de parece ser imprimir uma linha para cada arquivo processado, mas não quero que essa informação seja sobrecarregada quando zipar milhares de arquivos. Quero uma estimativa de quanto tempo vai demorar.

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

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

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

Por fim, tentei junto com o -qlike -qdbdc, mas isso não gera nada.

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

Parece exatamente o que eu quero, mas o problema é que minha versão do zipnão possui esse recurso. Estou usando o Ubuntu 14.04.1 64bit, bash-4.3.30 (1) e zip-3.00. Segundo a Wikipedia, esta é a última versão estável do zip.

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

erro
fonte
Registre a saída em um arquivo e use-a para fornecer informações de alto nível tee. Antes de iniciar o zip, faça uma contagem total dos arquivos (com lsou find -type f) e, enquanto estiver compactando, leia o arquivo de log para o número de linhas de arquivos processados ​​que ele já possui (com grepas linhas corretas para examinar e wc -las linhas count), para que suas informações de alto nível mostrem algo como "234/76438 arquivos processados";
Poder de Aquário
você pode trabalhar o tempo considerando o tamanho total dos arquivos e verificando o tamanho dos que já foram processados; mas ... até mesmo arquivos com o mesmo tamanho levar tempo diferente para ser processado por isso será sempre um palpite ...
Aquarius Poder
Eu não sei se você pode usar stdin ao fazer ZIP arquivos, mas se gzip está tudo bem, você pode fazer algo comopv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Respostas:

11

zippode compactar dados para saída padrão. Portanto, 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 -bepopções conforme sua conveniência.

pedroapero
fonte
Obrigado por isso! Eu faço isso no meu mac (brew install pv, brew install coreutils e substitua du pelo gdu).
26417 Jeff
6

Se você concorda em usar o 7z:

7z a output.zip folder/

Isso fornecerá 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  
qwr
fonte
2

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 [zip_do_ alvo] [pasta-para-zip] 2> & 1 |

zip recursivamente no arquivo [target_zip] o [folder_to_zip] redirecionando stderr para stdout. Observe que o 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 as linhas com os nomes dos arquivos à medida que eles saem do zip. O pv é operado no modo de linha (a contagem do progresso com base nas linhas e no tamanho também está no número de linhas a serem esperadas - consulte a página de manual do PV -l opção ).

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

O acima fornece porcentagem exata de conclusão, pois os 100% são atingidos quando todos os arquivos e diretórios foram 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 cerca de 30% (dependendo da taxa de compactação).

Lefteris
fonte