Comment trier numériquement des tailles lisibles par l'homme?

20

par exemple, j'ai une commande qui montre combien de dossier d'espace prend

du folder | sort -n

cela fonctionne très bien, mais j'aimerais avoir une forme lisible par l'homme

du -h folder

cependant, si je le fais, je ne peux pas le trier sous forme numérique.

Comment joindre du folderet du -h foldervoir la sortie triée en tant que du folder, mais avec la première colonne dedu -h folder

PS ce n'est qu'un exemple. cette technique pourrait être très utile pour moi (si c'est possible)

UAdapter
la source

Réponses:

11

Voici une approche plus générale. Obtenez la sortie de du folderet du -h folderdans deux fichiers différents.

du folder > file1
du -h folder > file2

L'élément clé est le suivant: concaténer file1et file2ligne par ligne, avec un délimiteur approprié.

paste -d '#' file1 file2 > file3

(en supposant qu'il #n'apparaît pas dans file1et file2)

Maintenant, triez file3. Notez que cela triera en fonction du file1contenu et rompra les liens par file2contenu. Extraire le résultat pertinent en utilisant cut:

sort -n -k1,7 file3 | cut -d '#' -f 2

Jetez également un œil à man sortd'autres options.


Vous pouvez également l'enregistrer en tant qu'alias, pour une réutilisation ultérieure. Pour ce faire, ajoutez ce qui suit au bas de ~/.bashrc:

sorted-du () {
    paste -d '#' <( du "$1" ) <( du -h "$1" ) | sort -n -k1,7 | cut -d '#' -f 2
}

Ensuite, ouvrez une nouvelle session de terminal et exécutez votre nouvel alias:

sorted-du /home
Prateek
la source
J'ai ajouté la dernière partie sur la façon de transformer votre solution en alias.
SirCharlo
1
Utiliser des fichiers réels dans un alias (puis appeler rm dessus) est une très mauvaise idée ! Pensez à ce qui se passerait si j'avais un fichier nommé file3dans mon répertoire, il serait écrasé puis supprimé! @SirCharlo Je supprime la définition d'alias de cette réponse et la remplace par quelque chose de plus sûr.
jmiserez
Eh bien, askubuntu.com/a/80248/22308 faites simplement cela avecsort -h
Nam G VU
36

Essayez quelque chose comme:

du -h folder | sort -h

Alternatives: -npour le tri numérique

Remarque: l' -hoption de tri n'existe que dans les versions plus récentes d'Ubuntu.

Allu2
la source
3
il y a dans la version 8.17, donc je suppose que c'est le moyen le plus simple
steabert
1
Merci à steabert d'avoir souligné que la commande sort a été améliorée de sort --version = 8.17 C'est la meilleure réponse pour les nouvelles versions d'Ubuntu.
Kat Amsterdam
Ce devrait être la cause acceptée car c'est un coup franc qui résout l'OP avecsort -h
Nam G VU
4

Cette réponse est valable pour 10.04.4LTS et les versions inférieures d'Ubuntu.

Malheureusement, la réponse précise qui trie KMG est difficile et complexe:

Vous pouvez alias l'intégralité de la commande du avec une qui trie lisible par l'homme en utilisant ce

alias duf='du -sk * | sort -n | perl -ne '\''($s,$f)=split(m{\t});for (qw(K M G)) {if($s<1024) {printf("%.1f",$s);print "$_\t$f"; last};$s=$s/1024}'\'

que j'ai trouvé ici

http://www.earthinfo.org/linux-disk-usage-sorted-by-size-and-human-readable/

il suffit de cd dans le dossier que vous souhaitez connaître, puis duf

vous pouvez ajouter cet alias duf à la fin de votre /home/user/.profile pour rendre la commande duf semi-permanente

résultats:

user@hostname:~$ duf
0.0K  Documenten
0.0K  Muziek
0.0K  Openbaar
0.0K  Sjablonen
0.0K  Video's
4.0K  backup_db.sql.g
4.0K  examples.desktop
12.0K xml printer ticket
52.0K hardinfo_report.html
152.0K    librxtxSerial.so
2.7M  jpos
4.4M  nxclient_3.5.0-7_amd64.deb
6.4M  nxnode_3.5.0-4_amd64.deb
6.8M  Downloads
7.4M  nxserver_3.5.0-5_amd64.deb
12.4M NetBeansProjects
18.1M mysqlworkbench.deb
28.3M Afbeeldingen
45.8M ergens-20110928-18.sql.gz
60.5M 2012-06-02ergens_archive.tar.gz
65.5M 2012-08-26ergens_archive.tar.gz
65.6M 2012-08-28ergens_archive.tar.gz
65.6M 2012-08-29ergens_archive.tar.gz
65.7M 2012-08-30ergens_archive.tar.gz
113.0M    Bureaublad
306.2M    ergens-20110928-18.sql

Voici pourquoi du -sch /var/* | sort -nne fonctionne pas voir le tri de MKKMMKKMMK

user@hostname:~$ du -sch /var/* |sort -n

0 /var/crash
0 /var/local
0 /var/lock
0 /var/opt
8,0M  /var/backups
12K   /var/games
16K   /var/tmp
17M   /var/log
68M   /var/cache
104K  /var/spool
144K  /var/run
351M  /var/lib
443M  totaal
704K  /var/mail
Kat Amsterdam
la source
J'ai signalé cela aux développeurs de gnu-core avec une demande de fonctionnalité pour améliorer la fonction du -h avec une fonction de tri. via [email protected]
Kat Amsterdam
+1, one-liner similaire:du folder | sort -n | cut -f 2 | while IFS= read -r -d '' path; do du -sh -- "$path"; done
steabert
Je viens d'essayer votre 1 doublure sur un système en direct. Obtenez une erreur d'accès refusé et aucun résultat. Avez-vous essayé cette commande sur un système Ubuntu en premier? J'ai changé de dossier en / home / username
Kat Amsterdam
oh, désolé, vous devriez laisser tomber le -d '', c'est un reste de l'utiliser sur la sortie de la commande file.
steabert
Cela semble très bien fonctionner sur les systèmes non Linux qui ne prennent pas en charge GNU sort.
Stefan Lasiewski
2

La commande GNU sorta l'option suivante:

-h, --human-numeric-sort comparer des nombres lisibles par l'homme (par exemple, 2K 1G).

Pour avoir cette option sur BSD / OSX, vous pouvez installer sortdepuis coreutils(via brew) et ajouter le dossier bin à votre PATHdans vos fichiers rc .

La commande ressemble donc à:

du -ah . | sort -rh | head -20
kenorb
la source
0

Pour les versions récentes d'Ubuntu, utilisez du -h directory | sort -h.

J'utilise une forme de ceci tout le temps pour trouver des fichiers hors de contrôle.

belacqua
la source
Duplicata des réponses 17 nov. 11 à 17:13 Allu2
Elder Geek
0

Ouvrez votre terminal avec Ctrl+ Alt+ tet tapez:

  du -sk * | sort -rn 
rɑːdʒɑ
la source
: DI est maintenant habitué à changer le Ctrl + Alt + t au format ci-dessus à tel point que j'ai collé le format requis sur mon Xpad. : D se sent bien d'être félicité pour un travail aussi
subalterne
Chaque travail que vous avez fait ici mérite d'être complété.
rɑːdʒɑ
0

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
Quel est l'intérêt de remplacer \npar \0? N'est-ce pas un peu trop tard pour ça?
muru
il prépare l'entrée xargs -0, qui s'attend à ce que l'entrée soit délimitée NUL (comme le produirait find -print0). Sinon, vous ne pouvez pas utiliser -0, et les apostrophes ont une signification particulière.
Mark Crossfield
Je sais -0, mais ce n'est pas pertinent: imgur.com/87w3vfj
muru
Je pense que cela fonctionne car vous avez utilisé un backtick, pas une apostrophe. gist.github.com/mrmanc/8aef830945ce03aa65f0
Mark Crossfield
0

Celui que j'ai trouvé fonctionnant sur tous les systèmes quelle que soit la version ( sort -hne fonctionne pas pour moi) est

du -h $(du * | sort -n | awk '{print $2}')

le awk '{print $2}'imprime essentiellement les noms de fichiers.

yahiaelgamal
la source