Comment trouver ce qui prend de la place dans / (sous Unix, et en particulier Solaris).

D’habitude, j’utilise la commande suivante (sous Linux) :

    du -ksx *|sort -n|awk '{print $2}'|xargs du -hsx

Explications :

Afficher tous les répertoires/fichiers avec leurs tailles tout en restant dans le même système de fichier, puis trier numériquement, puis ne garder que la deuxième partie de la ligne (awk), et enfin on recalcule les tailles et on les affichent dans un format humainement lisible (Go/Mo/Ko/O).

En gros je lance la commande, je vais là où ça me parait suspect (cd quoi) , et je relance la commande, etc

Tous ça marche bien jusqu’au moment ou on travaille dans / avec de multiple points de montages.

Le script suivant marche dans / sous Solaris :

Je cherche tous les points de montages à la racine en enlevant le / du début :

    MOUNTED=`mount|awk '$1 !~ /\/.*\// {print $1}'|sed 's#^/##'`

Je liste tout à la racine :

    ALL=`ls /`

J’initialise la variable NOTMOUNTPOINT :

    NOTMOUNTPOINT=""

Pour tous les fichiers/répertoire faire :

    for i in $ALL;do

Si l’élément courant n’est pas un point de montage, l’ajouter à la liste NOTMOUNTPOINT :

    echo $MOUNTED|grep -c $i > /dev/null; if [[ $? == 1 ]]; then NOTMOUNTPOINT="$NOTMOUNTPOINT $i";fi;done

Et ensuite avec la même méthode qu’au dessus, afficher les tailles des répertoires :

    echo $NOTMOUNTPOINT|xargs du -ksd|sort -n|awk '{print $2}'|xargs du -hsd

Ce qui donne en une seule ligne :

    MOUNTED=`mount|awk '$1 !~ /\/.*\// {print $1}'|sed 's/^\///'`;ALL=`ls /`;NOTMOUNTPOINT="";for i in $ALL;do echo $MOUNTED|grep -c $i > /dev/null; if [[ $? == 1 ]]; then NOTMOUNTPOINT="$NOTMOUNTPOINT $i";fi;done;echo $NOTMOUNTPOINT|xargs du -ksd|sort -n|awk '{print $2}'|xargs du -hsd