J'ai besoin de savoir combien d'espace disque est occupé par chaque utilisateur sur le réseau. Je suis conscient de df
et du
_ commandes: Je pourrais énumérer l'ensemble du système de fichiers et awk la sortie, mais je me demande s'il existe une commande plus standard.
La sortie que je recherche est:
usr1 xMb
usr2 yMb
[...]
Total zMb
Des idées?
Merci!
Ps. Red Hat Linux Ee
Est-ce une chose une fois, ou est cette information que vous voulez pouvoir extraire régulièrement? Si plus tard, une option est d'appliquer des quotas sur votre système de fichiers. Faire du fait que le système maintient en permanence la trace de la quantité de données utilisée par chaque utilisateur. De cette façon, les informations sont simplement une requête à la base de données de quotas.
Une autre belle solution que j'ai trouvée ici . Naviguez jusqu'au répertoire d'intérêt et courez (Alternativement, changez .
à quel que soit répertoire des intérêts, par exemple , /home/
):
find . -type f -printf "%u %s\n" \
| awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
Ou pour trouver les utilisateurs de problèmes (les répertoires aussi),
du -xk | sort -n | tail -25
et pour Solaris:
du -dk | sort -n | tail -25
Cela vous donne une liste des 25 plus grands répertoires. Pas tout à fait ce que vous avez demandé, mais je l'utilise tout le temps.
Ce que nous faisons dans de nombreux endroits est d'utiliser le système de quotas, mais définissez des quotas absurdement élevés. De cette façon, vous bénéficiez de la déclaration rapide. Sur un site, chaque utilisateur a 1 TB d'espace "quota".
Nous cumulons périodiquement le quota plus haut en tant que disque restreinte grandissant - initialement, il était de 30 Go par utilisateur, ce qui était absurdement élevé à l'époque.
Je l'ai fait :) Pas vite tu, mais ça marche:
#!/bin/bash
# Displays disk usage per user in the specified directory
# Usage: ./scriptname [target-directory]
[ "x$1" == "x" ] && dirname="." || dirname="$1"
for uid in `cat /etc/passwd |awk -F : '{ print $1 }' ` ; do # List all usernames
user_size=0
for file in `find "$dirname" -type f -user "$uid" 2>/dev/null` ; do # List the folder's files that belongs to the current user, Ignore possible `find` errors.
let user_size+=`stat -c '%s' $file` # Sum-up
done
[ $user_size -gt 0 ] && echo "USER=$uid, SIZE=$user_size" # Display the result if >0
done
Une forte augmentation de vitesse se produira si nous recherchons uniquement des UID> 1000:
- for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):.*$~\1~p"` ; do # List all usernames
+ for uid in `cat /etc/passwd | sed -rn "s~^([^:]+):[^:]:[0-9]{4,}:.*$~\1~p"` ; do # List all usernames having UID>1000