Calcular tamaño de archivo promedio

11

Estoy buscando una práctica línea para calcular el tamaño promedio de archivo en un directorio.

Lo que quiero es:

tamaño de todos los archivos / número de archivos en el directorio

taffer
fuente
¿Como en el tamaño promedio de cada archivo en el directorio? o el tamaño del directorio?
Drake Clarris
El tamaño promedio de un archivo en un directorio
taffer

Respuestas:

3

Con FreeBSD / Mac OS X find, staty awk(aunque no es exactamente una práctica):

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
fuente
Tenga en cuenta que en -v var=value, awkexpandirá las secuencias ANSI C como \n, \r... Mientras que los shells se exportan PWD, por lo que puede usar ENVIRON["PWD"]en el awkque no tiene ese tipo de problema para los directorios que tienen barras invertidas en su nombre.
Stéphane Chazelas
Si solo necesita el tamaño promedio en bytes, puede usarlo find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri
11

Con GNU encuentra:

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

O para el uso del disco:

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

Tenga en cuenta que si hay varios enlaces duros del mismo archivo allí, eso contará su uso de disco varias veces.

Lo anterior solo cuenta archivos regulares, no enlaces simbólicos o directorios u otros archivos especiales. Incluye archivos ocultos.

Lo mismo con los 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
fuente
3

Una solución simplista en una línea:

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

Tiene un truco sintáctico, solo considerando lslas líneas de salida que comienzan con '-', lo que debería constituir datos para archivos regulares.

Bruce Ediger
fuente
2

solo para archivos en un directorio, ignorando los subdirectorios:

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

O para contar todos los archivos, incluidos los archivos en subdirectorios:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)
Drake Clarris
fuente
Me gustaría no ignorar los subdirectorios.
taffer 01 de
bonito. Simplemente agregue -k a du invocation para obtener el resultado en 1024bytes (kb) en lugar de 512bytes (tamaño predeterminado de un fragmento de archivo).
Olivier Dulac
2
du -sagregará el uso del disco (no el tamaño) de todos los archivos y directorios y otros archivos no regulares , excluyendo los enlaces duros adicionales al mismo archivo, mientras findcontará todos los archivos regulares. Además, los nombres de archivo con caracteres de nueva línea se contarán varias veces. du -Ses específico de GNU. du -sinformará sectores o kilobytes dependiendo del sistema operativo.
Stéphane Chazelas
Como de costumbre, @StephaneChazelas, su conocimiento de Linux / Unix me asombra y me muestra cuán sucias son mis soluciones rápidas y sucias. ¿Cuánto tiempo llevas usando Linux / Unix?
Drake Clarris
La respuesta es terriblemente incorrecta y debe eliminarse. Explicado por Stephane.
Acumenus