Calcule o tamanho médio do arquivo

11

Estou à procura de uma linha única para calcular o tamanho médio do arquivo em um diretório.

O que eu quero é:

tamanho de todos os arquivos / número de arquivos no diretório

    
por taffer 01.02.2013 / 16:37

4 respostas

3

Com o FreeBSD / Mac OS X find , stat e awk (não é exatamente uma descrição prática):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'
    
por 02.02.2013 / 15:26
11

Com o GNU find:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

Ou para uso do disco:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

Observe que, se houver vários hardlinks do mesmo arquivo, isso contará o uso do disco várias vezes.

O acima só conta arquivos regulares, não links simbólicos ou diretórios ou outros arquivos especiais. Inclui arquivos ocultos.

O mesmo com zsh builtins:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))
    
por 01.02.2013 / 18:04
3

Uma solução simplista em uma linha:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

Ele possui um truque sintático, considerando apenas ls linhas de saída que começam com '-', o que deve constituir dados para arquivos regulares.

    
por 01.02.2013 / 17:33
2

apenas para arquivos em um diretório, ignorando subdiretórios:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

Ou para contar todos os arquivos, incluindo arquivos em subdiretórios:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)
    
por 01.02.2013 / 16:43