web-dev-qa-db-fra.com

Utilisation de disque par utilisateur à Linux / Unix

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

10
Escualo

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.

11
andol

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]}'
4
Jonas

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.

3
Ronald Pottol

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.

2
David Mackintosh

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
0
kolypto