Tamanho de todos os arquivos de uma determinada extensão em uma árvore de diretórios

16

Quero saber o tamanho do arquivo com extensão .o (arquivo de objeto) na minha pasta Home.

Eu posso encontrar todos os arquivos de objetos usando

find . -name '*.o'

Como posso agora calcular o tamanho total desses arquivos?

alhelal
fonte

Respostas:

24

Você está procurando tubos ( |). Eles são uma maneira de conectar vários comandos e transmitir a saída de um comando como entrada para outro. Nesse caso, você deseja passar todos os nomes de arquivos encontrados como entrada du(que calcula o tamanho). No entanto, como duespera que os nomes dos arquivos e os resultados findsejam apenas uma lista de texto (sim, o texto consiste em nomes de arquivos, mas dunão é possível saber, tudo o que vê é texto), você precisa usar algo como o xargsque linha de texto, trate-o como um nome de arquivo e passe-o para du. Juntando tudo isso, obtemos:

find . -name "*.o" | xargs du -sch
  • você deve sempre citar os padrões que você atribui find(como eu fiz acima "*.o":). Caso contrário, o shell expandirá *.opara os nomes de todos os arquivos correspondentes no diretório atual. Funcionou neste caso apenas porque você não tinha arquivos correspondentes.

  • Os -schsinalizadores para duestão documentados em man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

Observe, no entanto, que isso falhará nos nomes de arquivos que contêm espaço em branco. Isso quase certamente não será um problema para arquivos de objetos, mas no futuro, se você também precisar lidar com espaços, use:

find . -name "*.o" -print0 | xargs -0 du -sch

As -print0marcas findimprimem linhas separadas por NULL e as -0marcas xargsusam linhas como entrada.

Como alternativa, você pode findimprimir os tamanhos em si e depois somar:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

Isso também contorna o problema mencionado por @Serg nos comentários, onde há muitos argumentos e o comando é dividido em comandos separados.


Se você estiver usando bash (provavelmente está), há uma maneira mais simples:

shopt globstar 
du -sch **/*.o

O shopt globstarcomando faz **corresponder todos os arquivos e ou mais subdiretórios. Depois de ativá-lo,**/*.o corresponderá a todos os arquivos (e diretórios) cujo nome termina .o, para que possamos passar isso diretamente para du.

Observe que, diferentemente da findabordagem, isso não corresponde aos arquivos ocultos (aqueles cujo nome começa com a .). Para combinar com eles também, faça:

shopt -s dotglob globstar
du -sch **/*.o
Terdon
fonte
Há um pouco de problema com o primeiro. Existe algo como MAXARGS. Portanto, haverá várias iterações de due produzirá várias totallinhas. Aqui está o exemplo: paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy 26/08
@Serg verdade. Eu adicionei outra opção que evita isso.
precisa saber é
8

Use o -exec sinalizador para executar o ducomando ;(significado por cada arquivo)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

Saída de amostra:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

findé recursivo - o que significa que ele percorre todos os subdiretórios. Se você quiser apenas obter o total de todos os *.oarquivos no diretório atual, basta

du -b -c *.o
Sergiy Kolodyazhnyy
fonte
0

com perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Tamanho de todos os arquivos PDF não ocultos no diretório atual.

enlouquecer
fonte
1
OK, mas o OP está procurando .oarquivos e eles podem estar em subdiretórios. Você também pode adicionar um }{antes print $sumpara evitar a impressão da soma para cada iteração. Nós queremos apenas o último.
terdon 26/08/16