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
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
Respostas:
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);
}
'
-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.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
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))
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.
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)
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.