Como faço para encontrar arquivos e totalizar seus tamanhos?

8

Gostaria de encontrar uma série de arquivos (com base em uma expressão curinga) e totalizar o uso de disco deles.

Algo parecido com isto:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

Este trabalho. Mas não produz o resultado que estou procurando. Ele lista o espaço usado por cada arquivo, pois find está interagindo com eles.

O que eu quero é o total de du para todos os arquivos encontrados.

    
por Paul 19.12.2014 / 00:48

5 respostas

9

Solução

Ao fornecer a opção -c (ou --total ) para du(1) , você pode instruí-la para produzir um total geral. Se sua implementação de du(1) suportar uma dessas opções, você poderá obter o efeito desejado usando o seguinte comando:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

Explicação

A diferença entre a semântica de -exec command {} \; e -exec command {} + é a seguinte:

  • command {} \; executa command uma vez para cada resultado de find . O nome do caminho do resultado é passado em vez de {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} + executa command , quando todos os resultados foram recuperados. Os nomes dos caminhos dos resultados são passados em vez de {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

Para saber mais sobre as opções de du(1) e find(1) , você deve consultar os respectivos manpages.

    
por 19.12.2014 / 07:55
4

Tente isto:

du -c 'find . -name 'flibble*' -ctime +90' | tail -1

O comando original está dando um argumento e, em seguida, executando-o, até passar por todos os argumentos. Dessa forma, você simplesmente está dando todos os argumentos de uma só vez, depois cortando os tamanhos separados e deixando apenas o total. Você pode remover o pipe e a cauda para mostrar o tamanho de cada arquivo, se desejar.

    
por 19.12.2014 / 01:15
3

Você pode tentar isso:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total
    
por 26.12.2014 / 11:29
2

Eu teria o próprio find imprimindo o tamanho e usaria outra ferramenta para calcular o total:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

Se você também quiser ver os nomes dos arquivos:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'
    
por 19.12.2014 / 01:07
1

Um forro que deve funcionar para obter um total de Gigabytes na maioria dos sistemas:

echo "$ ((($ (localizar. -nome 'flibble *' -ctime +90 -tipo f -printf '% k +') 0) / 1024/1024)) GB"

    
por 19.12.2017 / 16:22

Tags