Como posso obter o tamanho de stdin?

8

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

Eu tentei usar du:

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

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

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

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

strugee
fonte

Respostas:

10

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

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

A solução é usar wc -c, que conta os próprios 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 awktransforma o número em um resultado legível.

strugee
fonte
8
Observe que, se você simplesmente omitir wco supérfluo -, também não precisará do cutcomando subsequente .
Janis
1
1.0K é o tamanho do bloco de stdin.
Cody Allan Taylor
6

Com o GNU tarvocê pode apenas fazer:

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

... que renderizará 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 ddpara entregar um relatório sobre a contagem de bytes. Isso pode ou não ser preferível wc, mas o ddpadrão é um tamanho de bloco de 512 bytes - que é idêntico ao tartamanho do bloco. Se o PIPE_BUF do seu sistema for grande o suficiente, você poderá expandir ddo tamanho do bloco para corresponder ao tartamanho do registro - que é 20 blocos ou 10240 bytes. Como isso:

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 melhor desempenho do que wc.

Nos casos de uso dde de taruso, você não precisa realmente se desfazer do fluxo. Eu redirecionei para o /dev/nullacima - mas eu poderia tê-lo redirecionado com facilidade para algum arquivo e ainda receber o relatório em seu tamanho no momento em que foi gravado.

mikeserv
fonte
Caso o arquivo seja gravado no disco, não seria necessário determinar separadamente o tamanho, pois essas informações são armazenadas com o arquivo. (+1) para o ganho de desempenho esperado de dd(comparado a wc).
Janis
1
@ Janis - possivelmente verdadeiro no caso mais simples - mas imagine que dda saída seja repassada - para um compressor, digamos - e por qualquer motivo que você deseje conhecer o tamanho bruto do arquivo e o compactado. Também é útil obter um relatório instantâneo sobre a contagem de registros - tarnão é apenas um arquivo, mas um formato de fluxo. Pode ser usado de outras maneiras além de salvar em um grupo de arquivos em outro arquivo. Geralmente é útil para bloquear um fluxo antes de modificá-lo. Em cada um desses limites de registro há um bloco inteiro de NULs.
precisa saber é o seguinte
5

Eu sugiro:

tar cf - dir | wc -c

Um simples c(nenhum avanço -é necessário) é usado para criar um tararquivo morto, fespecifica um arquivo de saída e -indica que ele é stdout . (Note que se você quiser apenas o tamanho e há muitos arquivos abaixo dir você pode sim omitir tar's vpor motivos de desempenho.)

Janis
fonte
@mikeserv; Parece-me que lembro que trabalhei com tars no passado em que era necessário especificar um arquivo tar (assim fe -). - Apenas procurei; sem f -o tarassumido /etc/mt0como padrão.
Janis
1
Pesquisei em um livro que usei como manual na época e acho que foi baseado no SysV R4. Poucas pessoas certamente se lembram do que /etc/mt0realmente significa - "fita magnética" ;-) Eu ficaria interessado em saber como o Solaris tarse comporta (porque o Solaris é um dos sistemas operacionais contemporâneos conhecidos por ainda possuir coisas realmente antigas /bin).
Janis
@mikeserv; PS: O livro menciona "UNIX Programmers Manual Volumes 1, 2A, 2B" da AT&T como fonte (embora não haja data manual ou versão de lançamento do UNIX; porém, deve ter sido do início dos anos 80, 1983 ou mais).
Janis
Você já viu isso ? Não relacionado - mas eu o encontrei hoje e achei que você poderia gostar.
mikeserv
Não entendo muito bem como essa resposta é diferente da minha. é a presença da -fbandeira para tar?
strugee
1

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

Nesse caso, eu sugiro pv- visualizador de tubos. Eu já vi referências a ele, mas ainda não tive a chance de brincar com ele.

Referências

Jeff Schaller
fonte