Je cherche un one-liner pratique pour calculer la taille moyenne d'un fichier dans un répertoire.
Ce que je veux c'est:
taille de tous les fichiers / nombre de fichiers dans le répertoire
Je cherche un one-liner pratique pour calculer la taille moyenne d'un fichier dans un répertoire.
Ce que je veux c'est:
taille de tous les fichiers / nombre de fichiers dans le répertoire
Réponses:
Avec FreeBSD / Mac OS X find, statet awk(pas exactement un one-liner pratique cependant):
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, awkdéveloppera des séquences C ANSI \n, \r... Alors que les coquilles exportent PWD, de sorte que vous pouvez utiliser ENVIRON["PWD"]dans ce awkqui n'a pas ce genre de problème pour les répertoires ayant antislashs dans leur nom.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Avec GNU trouver:
find . -type f -printf '%s\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'
Ou pour l'utilisation du disque:
find . -type f -printf '%k\n' | awk '{s+=$0}
END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'
Notez que s'il y a plusieurs liens physiques du même fichier, cela comptera plusieurs fois son utilisation du disque.
Ce qui précède ne compte que les fichiers réguliers, pas les liens symboliques ou les répertoires ou autres fichiers spéciaux. Il comprend des fichiers cachés.
La même chose avec les 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))
Une solution simpliste en une seule ligne:
ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'
Il contient une astuce syntaxique, ne prenant en compte que lsles lignes de sortie commençant par «-», ce qui devrait constituer des données pour les fichiers normaux.
pour uniquement les fichiers d'un répertoire, en ignorant les sous-répertoires:
expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)
Ou pour compter tous les fichiers, y compris les fichiers dans les sous-répertoires:
expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)
du -sajoutera l' utilisation du disque (pas la taille) de tous les fichiers et répertoires et autres fichiers non réguliers , à l'exclusion des liens durs supplémentaires vers le même fichier, tandis que findcomptera tous les fichiers normaux. De plus, les noms de fichiers avec des caractères de nouvelle ligne seront comptés plusieurs fois. du -Sest spécifique à GNU. du -srapportera des secteurs ou des kilo-octets selon le système d'exploitation.