Calcular o tamanho médio do arquivo

11

Estou procurando uma linha única útil 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

taffer
fonte
Como no tamanho médio de cada arquivo no diretório? ou o tamanho do diretório?
Drake Clarris
O tamanho médio de um arquivo em um diretório
Taffer

Respostas:

3

Com FreeBSD / Mac OS X find, state awk(não exatamente um prático one-liner embora):

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); 
   }
'
turid
fonte
Note-se que em -v var=value, awkvai expandir seqüências ANSI C como \n, \r... Enquanto conchas fazer a exportação PWD, assim você pode usar ENVIRON["PWD"]no awkque não tem esse tipo de problema para diretórios com barras invertidas em seu nome.
Stéphane Chazelas 02/02
Se você só precisa do tamanho médio em bytes, pode usar find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri
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 mencionado conta apenas arquivos regulares, não links simbólicos ou diretórios ou outros arquivos especiais. Inclui arquivos ocultos.

O mesmo com os zshbuiltins:

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))
Stéphane Chazelas
fonte
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 tem uma trapaça sintática, considerando apenas as lslinhas de saída que começam com '-', que devem constituir dados para arquivos regulares.

Bruce Ediger
fonte
2

apenas para arquivos em um diretório, ignorando os 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)
Drake Clarris
fonte
Eu gostaria de não ignorar subdiretórios.
taffer
legais. Basta adicionar -k à chamada para obter o resultado em 1024 bytes (kb) em vez de 512 bytes (tamanho padrão de um pedaço de arquivo).
Olivier Dulac
2
du -sadicionará o uso do disco (não o tamanho) de todos os arquivos e diretórios e outros arquivos não regulares , excluindo links físicos extras para o mesmo arquivo, enquanto findcontará todos os arquivos regulares. Além disso, nomes de arquivos com caracteres de nova linha serão contados várias vezes. du -Sé específico do GNU. du -srelatará setores ou kilobytes, dependendo do sistema operacional.
Stéphane Chazelas
Como de costume, @StephaneChazelas, seu conhecimento de Linux / Unix me surpreende e mostra como minhas soluções rápidas e sujas são sujas. Há quanto tempo você usa o linux / unix?
Drake Clarris
A resposta está terrivelmente errada e deve ser excluída. Explicado por Stephane.
Acumenus