Tri des tailles de fichiers lisibles par l'homme


16

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

Problème: considérez le problème de répertorier les fichiers / dossiers et de les trier par leur taille. Vous pouvez y parvenir en exécutant:

du -s * | sort -n

Ceci répertorie les fichiers / dossiers triés par leur taille. Cependant, la valeur de la taille imprimée est en octets (ou mégaoctets ou gigaoctets si vous le souhaitez).

Il serait souhaitable de pouvoir trier sur la base des valeurs lisibles par l'homme, donc je peux exécuter quelque chose d'analogue à

du -sh * | <human-readable file sort>

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

Réponses:



29

Utilisez GNU coreutils> = 7,5:

du -hs * | trier -h

(Tiré de cette question de défaut de serveur )

Page de manuel

Edit: Vous pouvez vérifier vos versions en utilisant du --versionet sort --versionsi vous utilisez les versions GNU. Si vous utilisez homebrew, vous devrez peut-être utiliser gduet gsort.


8
OSX n'a ​​pas cette option. Vous pouvez utiliser homebrew to brew install coreutils(qui ajoute à toutes les commandes coreutils un «g»). Vous pouvez alors le faire gdu -hs * | gsort -h.
dsummersl

1
Juste pour clarifier le point de @ dsummersl: cela du -hs *fonctionne bien sur Mac OS X, mais sort -hrevient sort: invalid option -- h. On peut également installer le paquet coreutils via MacPorts comme décrit ici .
jvriesem

3

Si vous êtes juste inquiet à propos des fichiers supérieurs à 1 Mo, comme il semble que vous le soyez, vous pouvez utiliser cette commande pour les trier et utiliser awk pour convertir la taille en Mo:

du -s * | sort -n | awk '{print int($1 / 1024)"M\t"$2}'

Encore une fois, cela arrondit les tailles au Mo le plus proche. Vous pouvez le modifier en le convertissant dans l'unité de votre choix.


Ceci est similaire à: du -sm * | sort -n. -s/ -grend dules tailles de sortie en mégaoctets / gigaoctets.
notnoop

Pour MB, vous devez diviser par 1024 de plus. Il en sera ainsiint($1 / (1024 * 1024))
Pratik Khadloya

2

Celui-ci gère les noms de fichiers avec des espaces ou des apostrophes, et fonctionne sur des systèmes qui ne prennent pas en charge xargs -dou sort -h:

du -s * | sort -n | cut -f2 | tr '\n' '\0' | xargs -0 -I {} du -sh "{}"

ce qui se traduit par:

368K    diskmanagementd
392K    racoon
468K    coreaudiod
472K    securityd
660K    sshd
3.6M    php-fpm

1

En voici un autre:

$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'

Vous devrez peut-être faire un

$ cpan Number::Bytes::Human

premier.


1

du -sk * | sort -n | awk '{print $ 2}' | pendant la lecture de f; do du -sh "$ f"; terminé


1

Cette commande triera par taille en Mo

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

C'est déjà ce que fait réellement l'utilisateur, il / elle n'a tout simplement pas donné l'exemple avec MiB mais en a parlé. Ce qu'il / elle cherche, c'est pouvoir trier lors de l'utilisation du -hdrapeau à du.
Tonin

0

Je me suis retrouvé ici car j'essayais de trier quelque chose d'autre qui combinait MB et GB dans la même sortie et je ne pouvais pas le contrôler.

$NFest utilisé car le motif #GBou #MBétait la dernière colonne de 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 modèle d'expression régulière qui contient un chiffre ou une .ou plusieurs fois suivi deGB

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

puis définissez variable asur la partie numérique de chaque ligne qui correspond au même modèle d'expression régulière dans la même dernière colonne ( $NF)

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

après le réglage a, utilisez printfpour formater la sortie comme${a*1024}MB

else {print $NF}

sinon il suffit d'imprimer la dernière colonne

sort -n

utiliser 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 existe un moyen de réutiliser le motif d'expression régulière, donc je ne fais le match qu'une seule fois et je le replace sur place, mais je ne sais pas encore comment le faire :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.