17 votes

Triage des tailles de fichiers lisibles par l'homme

Comment trier une liste en utilisant un tri de taille de fichier lisible par l'homme, un tri numérique prenant en compte l'identifiant de taille (G, M, K) ? Puis-je trier la sortie "du -sh" par exemple ?

Problème : Considérez le problème de la liste des fichiers/dossiers et de leur tri par taille. Vous pouvez y parvenir en exécutant :

du -s * | sort -n

Cela liste les fichiers/dossiers triés par leurs tailles. Cependant, la valeur de taille affichée est en octets (ou mégaoctets, ou gigaoctets si vous choisissez).

Il serait souhaitable de pouvoir trier en fonction des valeurs lisibles par l'homme, afin de pouvoir exécuter quelque chose d'analogique à

du -sh * | 

Et avoir un dossier de 1,5 Go qui apparaît après 2,0 Mo.

1voto

Du -sk * | tri -n | awk '{ print $2 }' | while read f ; do du -sh "$f" ; done

1voto

user12458 Points 121

Cette commande triera par taille en Mo

du --block-size=MiB --max-depth=1 chemin | sort -n

0voto

J'ai fini par arriver ici car j'essayais de trier quelque chose qui combinait des MB et des GB dans la même sortie et je ne pouvais pas le contrôler.

$NF est utilisé car le motif #GB ou #MB était la dernière colonne dans la sortie :

somecommand | \
gawk '{
  if ($NF ~ /[0-9\.]+GB/) 
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF} 
}' | \
sort -n

Explication de la commande awk :

if ($NF ~ /[0-9\.]+GB/)

si la dernière colonne correspond au motif regex qui contient un chiffre ou un . une ou plusieurs fois suivi de GB

{ a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \

ensuite, définir la variable a sur la partie numérique de chaque ligne qui correspond au même motif regex dans la même dernière colonne ($NF)

printf "%sMB\n", a*1024} \

après avoir défini a, utilisez printf pour formater la sortie en tant que ${a*1024}MB

else {print $NF}

sinon, imprimez simplement la dernière colonne

sort -n

utilisez un tri numérique sur la sortie


exemple

echo "4MB\n5GB\n420MB\n420GB\n1024MB\n1GB" | \                                                                                                                                 23:43:06 (EMP-2653/package-upgrades) Ø M
gawk '{
  if ($NF ~ /[0-9\.]+GB/)
    { a=gensub(/([0-9\.]+)(GB)/,"\\1","g",$NF); \
    printf "%sMB\n", a*1024} \
  else {print $NF}
}' | \
sort -n

Je suis sûr qu'il y a un moyen de réutiliser le motif regex afin de ne faire la correspondance qu'une seule fois et de remplacer sur place, mais je ne sais pas encore comment faire :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X