Festplattennutzung pro Benutzer unter Linux / Unix

10

Ich muss herausfinden, wie viel Speicherplatz von jedem Benutzer im Netzwerk belegt wird. Ich kenne dfund duBefehle: Ich könnte das gesamte Dateisystem auflisten und die Ausgabe AWK, aber ich frage mich, ob es einen Standardbefehl gibt.

Die Ausgabe, die ich suche, ist:

usr1  xMb
usr2  yMb
[...]
Total zMb

Irgendwelche Ideen?

Vielen Dank!

PS. Red Hat Linux EE

Escualo
quelle

Antworten:

11

Ist dies eine einmalige Sache oder möchten Sie diese Informationen regelmäßig extrahieren können? Falls es das spätere ist, besteht eine Möglichkeit darin, Kontingente auf Ihr Dateisystem anzuwenden. Dabei verfolgt das System kontinuierlich die von jedem Benutzer verwendete Datenmenge. Auf diese Weise sind die Informationen lediglich eine Abfrage an die Kontingentdatenbank entfernt.

andol
quelle
1
+1 Quote ist die Lösung!
ThorstenS
Eine einmalige Sache; Möglicherweise eine Lösung, die in einem kleinen Skript gespeichert werden kann, damit die Benutzer ihre Nutzung berechnen können, wenn sie möchten. Wir können die Datenmenge nicht begrenzen, da die Art der Arbeit, die wir ausführen, keine harten Grenzen aufweist.
Escualo
@ThorstenS: Wir führen technische Berechnungen durch und müssen Tonnen von Informationen generieren, die nach einem Lauf möglicherweise entfernt werden oder nicht. Ich denke nicht, dass Quoten in unserer Situation helfen.
Escualo
1
@Arrieta: Sie müssen ihre Verwendung nicht einschränken. Geben Sie einfach jedem Benutzer eine lächerlich hohe Quote. Außerdem kann jeder Benutzer die Kontingentdatenbank selbst abfragen und sehen, wie viele Daten er gerade speichert.
Andol
2
Sie müssen das Kontingent nicht einmal auf eine große Zahl festlegen. Wenn Sie es nicht festlegen (dh 0), wird es nicht erzwungen, aber die Verwendung wird aufgezeichnet
Daniel,
4

Eine weitere schöne Lösung habe ich hier gefunden . Navigieren Sie zum Verzeichnis von Interesse und run (alternativ Wechsel .zu welcher auch immer Verzeichnis interessiert, zum Beispiel , /home/):

find . -type f -printf "%u  %s\n" \
  | awk '{user[$1]+=$2}; END{for(i in user) print i,user[i]}'
Jonas
quelle
1
+1. Vielleicht fügen Sie einen -typ f hinzu, suchen Sie wirklich nur nach Dateien?
Hennes
Gute Antwort. Verwenden Sie -printf "%u\t%s\n"und, awk -v OFS="\t"wenn Sie glauben, jemals einen Benutzernamen mit Leerzeichen darin zu haben.
TheDudeAbides
3

Oder um die problematischen Benutzer zu finden (auch Verzeichnisse),

du -xk | sort -n | tail -25

und für Solaris:

du -dk | sort -n | tail -25   

Dies gibt Ihnen eine Liste der 25 größten Verzeichnisse. Nicht ganz das, wonach Sie gefragt haben, aber ich benutze es die ganze Zeit.

Ronald Pottol
quelle
2

Was wir an vielen Orten tun, ist das Quotensystem zu verwenden, aber absurd hohe Quoten festzulegen. Auf diese Weise profitieren Sie von einer schnellen Berichterstellung. An einem Standort verfügt jeder Benutzer über 1 TB "Kontingent" -Speicherplatz.

Wir erhöhen das Kontingent regelmäßig, wenn die zu wartende Festplatte wächst - anfangs waren es 30 GB pro Benutzer, was zu dieser Zeit absurd hoch war.

David Mackintosh
quelle
0

Es gibt keinen solchen Befehl. Dazu müssen Sie einige Shell-Befehle schreiben.

  1. Holen Sie sich alle Benutzer aus / etc / passwd mit uid> 1000
  2. Verwenden Sie find -uid und durchsuchen Sie alle Dateien des Benutzers
  3. Verwenden Sie diese Liste, um du -s zu füttern
ThorstenS
quelle
Ineffizient. Sie müssen find nicht mehrmals ausführen, wenn Sie die Informationen gleichzeitig protokollieren. Speichern Sie diese Informationen während Ihres ersten Laufs. Entweder in einer Datei oder in einem assoziativen Array.
Hennes
0

Die Methode von ThorstenS scheint mir mehr Arbeit zu sein, als sie benötigt, da sie mehrmals ausgeführt wird. Für einen Einzelfall würde ich nur einen Suchbefehl ausführen und den Eigentümer und die Größe jeder Datei ausgeben und dann eine Art Magie für diese Datei ausführen.

Der Fund würde so etwas wie den Benutzernamen (oder die ID-Nummer ohne Benutzernamen) und den in Bytes verwendeten Speicherplatz in einer durch Null-Byte getrennten Datei zurückgeben:

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

Sie können das \0durch etwas ersetzen, mit dem Sie möglicherweise etwas einfacher arbeiten können, z. B. Tabulatoren oder Zeilenumbrüche, aber das wäre weniger sicher, wenn Sie funky Dateinamen haben.

Wenn Sie noch effizienter sein möchten, können Sie die Ausgabe an ein Skript weiterleiten, das sie während der Ausführung verarbeitet. Dies wäre jedoch etwas aufwändiger und müsste beim ersten Mal richtig ausgeführt werden.

Kyle Brandt
quelle
0

Ich habe es geschafft :) Nicht schnell du, aber funktioniert:

#!/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

Eine große Geschwindigkeitssteigerung wird auftreten, wenn wir nur nach UIDs suchen, die> 1000 sind:

- 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
quelle