Como posso obter o tamanho de stdin?

6

Estou prestes a compactar um diretório grande e quero saber qual será o tamanho exato do arquivo resultante.

Eu tentei usar du :

$ tar -cv dir | du -h -
du: cannot access '-': No such file or directory

Depois tentei usar a versão do arquivo '-':

$ tar -cv dir | du -h /dev/stdin
1.0K

Tenho certeza de que esse número não é exato. Como posso obter o tamanho de stdin?

    
por strugee 01.06.2015 / 03:36

4 respostas

9

tl; dr : tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'

du na verdade não conta o tamanho do arquivo em si. Apenas pede ao kernel para consultar o sistema de arquivos, que já controla o tamanho do arquivo. É por isso que é tão rápido. Por causa disso, e o fato de você estar contando um fluxo, não um arquivo, du não funciona. Meu palpite é que 1.0K é um tamanho codificado para /dev/std* no kernel.

A solução é usar wc -c , que conta bytes em vez de consultar o kernel:

$ tar -cv dir | wc -c

Se você deseja uma saída semelhante a du -h :

$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'

O awk transforma o número em um resultado legível por humanos.

    
por 01.06.2015 / 03:36
5

Eu sugeriria:

tar cf - dir | wc -c

Um simples c (não é necessário - obrigatório) é usado para criar um tar archive, f especifica um arquivo de saída e - indica que ele é stdout . (Observe que, se você quiser apenas o tamanho e houver muitos arquivos abaixo de dir , poderá omitir tar v por motivos de desempenho.)

    
por 01.06.2015 / 04:05
5

Com o% GNUtar, você pode simplesmente fazer:

tar --totals -c . >/dev/null

... que renderiza a saída como ...

Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)

... no stderr. Da mesma forma, com qualquer tar (ou fluxo) , você pode usar dd para entregar um relatório sobre as contagens de bytes. Isso pode ou não ser preferível a wc , mas dd é padronizado para um tamanho de bloco de 512 bytes - o que é idêntico ao tamanho de bloco de tar . Se o PIPE_BUF do seu sistema for grande o suficiente, você poderá expandir o dd 's tamanho de bloco para corresponder ao tamanho de registro de tar - que é 20 blocos ou 10240 bytes. Assim:

tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s

Isso pode ou não oferecer uma solução com maior desempenho que wc .

Nos casos de uso dd e tar , você não precisa descartar o fluxo. Eu redireciono para /dev/null acima - mas eu poderia ter redirecionado facilmente para algum arquivo e ainda receber o relatório sobre seu tamanho no momento em que ele foi escrito.

    
por 01.06.2015 / 06:38
1

O texto da sua pergunta presta-se às respostas tar ... | wc -c acima. Eu li sua pergunta originalmente com uma suposição silenciosa de que você queria que o tamanho fosse informado enquanto criava o arquivo tar (talvez a saída de tar estivesse sendo canalizada por um link de rede?).

Nesse caso, sugiro pv - visualizador de canais. Eu já vi referência a ele, mas ainda não tive a chance de jogar com ele.

Referências

por 02.06.2015 / 02:38