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.
brew install coreutils
(qui ajoute à toutes les commandes coreutils un «g»). Vous pouvez alors le fairegdu -hs * | gsort -h
.du -hs *
fonctionne bien sur Mac OS X, maissort -h
revientsort: invalid option -- h
. On peut également installer le paquet coreutils via MacPorts comme décrit ici .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:
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.
la source
du -sm * | sort -n
.-s
/-g
renddu
les tailles de sortie en mégaoctets / gigaoctets.int($1 / (1024 * 1024))
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 -d
ousort -h
:ce qui se traduit par:
la source
En voici un autre:
Vous devrez peut-être faire un
premier.
la source
du -sk * | sort -n | awk '{print $ 2}' | pendant la lecture de f; do du -sh "$ f"; terminé
la source
Cette commande triera par taille en Mo
la source
-h
drapeau à du.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.
$NF
est utilisé car le motif#GB
ou#MB
était la dernière colonne de la sortie: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
a
sur 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
, utilisezprintf
pour 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
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 :)
la source