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.

notnoop
la source

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.

Jason Axelson
la source
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.

Patrick
la source
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
Mark Crossfield
la source
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.

0x89
la source
1

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


la source
1

Cette commande triera par taille en Mo

du --block-size=MiB --max-depth=1 path | sort -n
lukmansh
la source
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 :)

Jens Bodal
la source