1490 votes

Comment puis-je trier la sortie de du -h par taille ?

J'ai besoin d'obtenir une liste de sortie du lisible par l'homme.

Cependant, du n'a pas d'option "trier par taille", et le tuyautage à sort ne fonctionne pas avec l'indicateur de lisibilité humaine.

Par exemple, en courant :

du | sort -n -r 

Produit une utilisation du disque triée par taille (en ordre décroissant) :

du |sort -n -r
65108   .
61508   ./dir3
2056    ./dir4
1032    ./dir1
508     ./dir2

Cependant, en l'exécutant avec l'indicateur de lisibilité humaine, le tri ne se fait pas correctement :

du -h | sort -n -r

508K    ./dir2
64M     .
61M     ./dir3
2.1M    ./dir4
1.1M    ./dir1

Quelqu'un connaît-il un moyen de trier du -h par taille ?

0 votes

Voici une question très proche : serverfault.com/q/737537/35034

0 votes

Vous avez vu celui-ci ? unix.stackexchange.com/questions/4681/ Il s'agit d'un quasi-duplicata et il vaut de l'or. Vous faites une recherche normale du mais ajoutez le -h à l'option sort commande. Vous pouvez ajouter -rh afin que les plus grands soient les premiers dans le fichier, sinon vous devez tail pour voir les porcs de l'espace.

0 votes

Voir aussi superuser.com/questions/300606/ pour une alternative plus conviviale ( ncdu ).

1voto

Keith Yoder Points 11

J'avais utilisé la solution fournie par @ptman, mais un récent changement de serveur a rendu cette solution non viable. A la place, j'utilise le bash script :

#!/bin/bash
# File: duf.sh
# list contents of the current directory by increasing 
#+size in human readable format

# for some, "-d 1" will be "--maxdepth=1"
du -k -d 1 | sort -g | awk '
{
if($1<1024)
    printf("%.0f KB\t%s",$1,$2);
else if($1<1024*1024)
    printf("%.1f MB\t%s",$1/1024,$2);
else
    printf("%.1f GB\t%s",$1/1024/1024,$2);
}'

0 votes

Le BSD du -d 1 est prise en charge par GNU du depuis la sortie de coreutils 8.6 en 2010 (bien que sa première disponibilité sur Red Hat ait été RHEL 7 en 2014), vous n'avez donc plus besoin de la syntaxe --maxdepth=1 . J'ai seulement a découvert à ce sujet récemment.

1voto

ageek2remember Points 101

du -s * | sort -nr | cut -f2 | xargs du -sh

0 votes

Ce n'est pas une bonne solution, car elle traverse deux fois le système de fichiers.

1voto

laurens Points 107

Il y a beaucoup de réponses ici, dont beaucoup sont des doublons. Je vois trois tendances : le piping à travers un deuxième appel du, l'utilisation de code Shell/awk compliqué, et l'utilisation d'autres langages.

Voici un Solution conforme à POSIX en utilisant du y awk qui devrait fonctionner sur tous les systèmes.

J'ai adopté une approche légèrement différente, en ajoutant -x pour s'assurer que nous restons sur le même système de fichiers (je n'ai besoin de cette opération que lorsque je suis à court d'espace disque, alors pourquoi éliminer les éléments que j'ai montés dans cette arborescence FS ou déplacés et remis en lien symbolique ? Dans ce cas, je choisis généralement no à trier pour que je puisse mieux voir la structure hiérarchique.

sudo du -x | awk '
  $1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'

(Puisque c'est en unités cohérentes, vous pouvez alors ajouter | sort -n si vous voulez vraiment trier résultats).

Cela permet de filtrer tout répertoire dont le contenu (cumulé) ne dépasse pas 512 Mo, puis d'afficher les tailles en gigaoctets. Par défaut, du utilise une taille de bloc de 512 octets (donc la condition de l'awk de 2 20 est de 512MB et ses 2 21 le diviseur convertit les unités en GB - nous pourrions utiliser du -kx con $1 > 512*1024 y s/1024^2 pour être plus lisible par l'homme). Dans la condition awk, nous définissons s à la taille afin que nous puissions le retirer de la ligne ( $0 ). Cela permet de conserver le délimiteur (qui est réduit à un seul espace), de sorte que la version finale du fichier %s représente un espace et ensuite le nom du répertoire agrégé. %7s aligne l'arrondi %.2f Taille du Go (augmentation à %8s si vous avez >10TB).

Contrairement à la plupart des solutions proposées ici, ceci supporte correctement les répertoires avec des espaces dans leurs noms (aunque chaque y compris celle-ci, traitera mal les noms de répertoire contenant des sauts de ligne).

0voto

Eddie Points 1222

Au moins avec les outils habituels, cela sera difficile en raison du format des nombres lisibles par l'homme (notez que sort fait un "bon travail" ici car il trie les nombres - 508, 64, 61, 2, 2 - il ne peut simplement pas trier les nombres à virgule flottante avec un multiplicateur supplémentaire).

J'essaierais dans l'autre sens - utiliser la sortie de "du | sort -n -r" et ensuite convertir les chiffres dans un format lisible par l'homme avec un script ou un programme.

0voto

Vous pouvez essayer :

for i in `du -s * | sort -n | cut -f2`
do
  du -h $i;
done

J'espère que cela vous aidera.

0 votes

C'est ce que fait xargs ;-)

0 votes

Hehe, j'oublie toujours xargs. ;) A la fin de la journée, tout ce qui permet de faire le travail est bon.

0 votes

MacOSX par défaut (c.-à-d. en dehors de home-brew) ne prend pas en charge un fichier xargs ce formulaire était donc nécessaire. Cependant, pour les fichiers contenant des espaces, vous devez définir l'IFS : IFS=$'\n'

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