Utilisation du disque par utilisateur sous Linux / Unix

10

J'ai besoin de savoir combien d'espace disque est occupé par chaque utilisateur du réseau. Je connais dfet les ducommandes: je pourrais lister l'ensemble du système de fichiers et AWK la sortie, mais je me demande s'il y a 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

Escualo
la source

Réponses:

11

S'agit-il d'une seule fois ou est-ce que vous souhaitez pouvoir extraire régulièrement ces informations? Dans le cas où c'est le dernier, une option consiste à appliquer des quotas sur votre système de fichiers. Ce faisant, le système garde en permanence la quantité de données utilisées par chaque utilisateur. De cette façon, les informations sont simplement une requête vers la base de données de quotas.

andol
la source
1
+1 quota est la solution!
ThorstenS
Une chose unique; éventuellement une solution qui peut être stockée dans un petit script pour que les utilisateurs calculent leur utilisation s'ils le souhaitent. Nous ne pouvons pas limiter la quantité de données car le type de travail que nous effectuons ne respecte pas les limites strictes.
Escualo
@ThorstenS: Nous faisons de l'informatique technique et nous devons générer des tonnes d'informations qui peuvent ou non être supprimées après une exécution. Je ne pense pas que les quotas nous aident dans notre situation.
Escualo
1
@Arrieta: Vous n'avez pas à limiter leur utilisation. Donnez simplement à chaque utilisateur un quota ridiculement élevé. En outre, chaque utilisateur peut interroger par lui-même la base de données de quotas et voir la quantité de données qu'il stocke actuellement.
andol
2
Vous n'avez même pas besoin de définir le quota sur un grand nombre, si vous le laissez non défini (c.-à-d. 0), il ne sera pas appliqué, mais il enregistrera l'utilisation
Daniel
4

Une autre belle solution que j'ai trouvée ici . Accédez au répertoire d'intérêt, et exécuter (alternativement, changement .de répertoire selon les 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]}'
Jonas
la source
1
+1. Peut-être ajouter un -type f si vous ne cherchez vraiment que des fichiers?
Hennes
Bonne réponse. Utilisez -printf "%u\t%s\n"et awk -v OFS="\t"si vous pensez que vous jamais pourriez avoir un nom d' utilisateur avec un espace en elle.
TheDudeAbides
3

Ou pour trouver les utilisateurs problématiques (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.

Ronald Pottol
la source
2

Dans de nombreux endroits, nous utilisons le système des quotas, mais fixons des quotas absurdement élevés. De cette façon, vous bénéficiez de rapports rapides. Sur un site, chaque utilisateur dispose de 1 To d'espace "quota".

Nous augmentons périodiquement le quota à mesure que le disque réparable augmente - au départ, il était de 30 Go par utilisateur, ce qui était absurdement élevé à l'époque.

David Mackintosh
la source
0

Il n'y a pas une telle commande. Vous devez écrire quelques commandes shell pour cela.

  1. obtenir tous les utilisateurs de / etc / passwd avec uid> 1000
  2. utilisez find -uid et recherchez tous les fichiers de l'utilisateur
  3. utilisez cette liste pour nourrir du -s
ThorstenS
la source
Inefficace. Vous n'avez pas besoin d'exécuter la recherche plusieurs fois si vous enregistrez les informations en même temps. Enregistrez ces informations lors de votre première exécution. Soit dans un fichier, soit dans un tableau associatif.
Hennes
0

La méthode de ThorstenS semble me demander plus de travail car elle s'exécute plusieurs fois. Pour un seul, je voudrais juste faire 1 commande find, et sortir le propriétaire et la taille de chaque fichier, puis faire une sorte de magie sur ce fichier.

La recherche serait quelque chose comme qui renvoie le nom d'utilisateur (ou le numéro d'identification sans nom d'utilisateur) et l'espace utilisé en octets, dans un fichier délimité par des octets nuls:

sudo bash -c 'find . -printf "%u\0%s\0" > username_usage'

Vous pouvez remplacer le \0par quelque chose qui pourrait être un peu plus facile à travailler, comme des onglets ou des nouvelles lignes, mais ce serait moins sûr si vous avez des noms de fichiers géniaux.

Si vous vouliez être encore plus efficace, vous pourriez diriger la sortie vers un script qui la gère au fur et à mesure de son exécution, mais ce serait un peu plus de travail, et vous devriez le faire correctement la première fois.

Kyle Brandt
la source
0

Je l'ai fait :) Pas vite, 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 grande augmentation de vitesse se produira si nous recherchons uniquement des UID supérieurs à 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
kolypto
la source