Il y a beaucoup de réponses ici, dont beaucoup sont des doublons. Je vois trois tendances: passer d'un second appel à un autre, utiliser un code shell / awk compliqué et utiliser d'autres langages.
Voici une solution compatible POSIX utilisant du et awk qui devrait fonctionner sur tous les systèmes.
J'ai adopté une approche légèrement différente, en ajoutant -x
pour nous assurer de rester sur le même système de fichiers (je n'ai besoin de cette opération que lorsque je manque d'espace disque, alors pourquoi supprimer les éléments que j'ai montés dans cet arbre FS ou déplacés et symlinked back?) et l’affichage des unités constantes pour faciliter l’analyse visuelle. Dans ce cas, je choisis généralement de ne pas trier pour 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 }'
(Puisqu'il s'agit d'unités cohérentes, vous pouvez alors ajouter | sort -n
si vous voulez vraiment trier les résultats.)
Cela filtre tout répertoire dont le contenu (cumulatif) ne dépasse pas 512 Mo, puis affiche les tailles en giga-octets. Par défaut, du utilise une taille de bloc de 512 octets (si l'état de awk de 2 20 blocs est 512Mo et son 2 21 diviseur convertit les unités GB - nous pourrions utiliser du -kx
avec $1 > 512*1024
et s/1024^2
d'être plus lisible par l' homme). Dans la condition awk, nous avons défini s
la taille pour pouvoir la supprimer de la ligne ( $0
). Ceci conserve le délimiteur (qui est réduit à un seul espace), ainsi la finale %s
représente un espace puis le nom du répertoire agrégé. %7s
aligne la %.2f
taille arrondie en Go (augmentez à %8s
si vous avez> 10 To).
Contrairement à la plupart des solutions proposées ici, cela prend correctement en charge les répertoires avec des espaces dans leurs noms (même si chaque solution, y compris celle-ci, manipulera mal les noms de répertoires contenant des sauts de ligne).