J'ai un système de fichiers qui contient quelques millions de fichiers et j'aimerais voir une répartition des tailles de fichiers récursivement dans un répertoire particulier. J'ai l'impression que c'est totalement faisable avec un peu de bash / awk fu, mais je pourrais utiliser une main. En gros, j'aimerais quelque chose comme ceci:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Je pense que cela ne devrait pas être trop grave étant donné une boucle et une taille de fichier conditionnelle log2, mais je n'arrive pas à y arriver.
Question connexe: Comment puis-je trouver des fichiers plus gros / plus petits que x octets? .
linux
command-line
bash
unix
notpeter
la source
la source
ls
en afind
. Je remets ça comme ça.xargs
est beaucoup plus rapide que-exec
, j'ai donc utilisé cette méthode.Basé sur la réponse de garyjohn, voici un one-liner, qui formate également la sortie en lisible par l'homme:
En voici la version étendue:
Dans le premier,
awk
j'ai défini une taille de fichier minimale pour collecter tous les fichiers de moins de 1 ko à un seul endroit. Dans le secondawk
, la fonctionhuman(x)
est définie pour créer une taille lisible par l'homme. Cette partie est basée sur l'une des réponses ici: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1L'exemple de sortie ressemble à ceci:
la source
Essaye ça:
PRODUCTION :
EXPLICATION:
find . -type f -exec ls -lh {} \;
: assez simple, trouvez les fichiers dans le répertoire courant et exécutez-ls -lh
lesmatch($5,/([0-9.]+)([A-Z]+)/,k);
: cela extraira la taille du fichier et enregistrera chaque correspondance dans le tableauk
.if(!k[2]){print "1K"}
: sik[2]
n'est pas défini, la taille du fichier est <1K. Puisque j'imagine que vous ne vous souciez pas de ces petites tailles, le script s'imprimera1K
pour tous les fichiers dont la taille est <= 1K.else{printf "%.0f%s\n",k[1],k[2]}
: si le fichier est supérieur à 1 Ko, arrondissez la taille du fichier à l'entier le plus proche et imprimez avec son modificateur (K, M ou G).sort | uniq -c
: compte les occurrences de chaque ligne (taille de fichier) imprimée.sort -hk 2
: tri selon le deuxième champ au format lisible par l'homme. De cette façon,7G
est trié après8M
.la source