Progresso do alcatrão por arquivo com pv para vários arquivos / pastas por vez?

0

Eu tenho usado esse comando de uma linha que encontrei em outro post aqui e funciona muito bem para uma pasta de cada vez. Este é o comando:

tar -cf - /opt/folder1 | pv -s $(du -sb /opt/folder1 | awk '{print $1}') | gzip > archive.tar.gz

Como isso pode ser alterado para trabalhar com vários arquivos / pastas de cada vez e obter o progresso geral, em vez de executar o mesmo comando para cada pasta / arquivo. Aqui está o caso de uso:

Eu tenho arquivos / opt / folder1, / opt / folder2 e /opt/folder3/*.db. Tudo isso pode ser combinado em uma variável como essa.

filestobackup=(
        /opt/folder1
        /opt/folder2 
        /opt/folder3/*.db
    )

Isso não funciona:

tar -cf - "${filestobackup[@]}" | pv -s $(du -sb "${filestobackup[@]}" | awk '{print $1}') | gzip > archive.tar.gz
    
por user1781482 29.07.2015 / 21:21

1 resposta

0

Resposta rápida : altere a linha para

tar -cf - "${filestobackup[@]}" | pv -s $(du -cb "${filestobackup[@]}" | tail -1 | awk '{print $1}') | gzip > archive.tar.gz

Resposta longa : O problema é que du produzirá várias linhas de saída e não apenas uma, como no caso de um único diretório. O interruptor -s faz du imprimir o tamanho total para cada entrada. Como você está passando várias entradas para du (duas para a pasta1 e a pasta2, mais uma para cada arquivo .db na pasta 3), du imprimirá algo como:

2112345 opt/folder1
57148   opt/folder2
388     opt/folder3/foo.db
161     opt/folder3/bar.db

Ao usar o comutador -c , du imprime uma última linha contendo o total geral. Para usar esse valor, você precisa filtrar du output para obter apenas a última linha.

Isso pode ser feito com o awk, que você já usa no pipe, ou, mais simplesmente, embora com uma penalidade (menor) no desempenho, adicionando um filtro tail -1 .

    
por 03.09.2015 / 17:08