Benutzereigene Ordner finden

Benutzereigene Ordner finden

Ich habe mehrere freigegebene Ordner und muss herausfinden, ob ein Benutzer dort mehrere Ordner hat. Beispiel:

/shared/release/
/shared/compile/
/shared/tags/
/shared/general/

Ich brauche ein Bash-Skript, das diese Ordner auflistet und mir sagt, ob ein Benutzer mehr als einen eigenen Ordner besitzt.

Wie kann ich mithilfe von Bash eine Liste dieser Ordner abrufen und feststellen, ob ein Benutzer mehr als einen besitzt?

Antwort1

Verwendung von find:

find /shared -mindepth 1 -maxdepth 1 -type d -user <username>

Ersetzen Sie es <username>durch den tatsächlichen Benutzernamen, nach dem Sie suchen möchten.

  • -maxdepth 1verhindert rekursives Durchlaufen, d. h. es wird nur /shareddas Verzeichnis betrachtet

  • -mindepth 1verhindert, dass das /sharedVerzeichnis selbst aufgelistet wird, wenn es dem Eigentümer gehört <username>. Wenn Sie dieses Verhalten nicht möchten, entfernen Sie diese Option

  • -type dzeigt an, dass wir nur an Verzeichnissen interessiert sind

  • -user <username><username>zeigt an, dass wir nach den eigenen Dateien (Verzeichnissen) suchen

Antwort2

Hier wird angezeigt, welche Benutzer mehr als ein Verzeichnis haben:

find /shared -type d -printf '%u\n' | sort | uniq -dc

Dies erfordert, dass GNU finddie Aktion unterstützt -printf. Ihr CentOS wird dies haben.

Dadurch werden sowohl die Benutzer mit mehr als einem Verzeichnis als auch deren Verzeichnisse aufgelistet:

find /shared -type d -printf '%u %p\0' | awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n  ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"

Für maximale Flexibilität haben wir NUL-getrennte Ausgaben von verwendet find. Um damit arbeiten zu können, benötigen wir GNU awk oder aktuelle Versionen von mawk, die NUL-getrennte Eingaben unterstützen. Da Sie CentOS verwenden, sollte dies kein Problem sein.

Wie es funktioniert

  • find /shared -type d -printf '%u %p\0'

    Dies weist find an, unter nach Verzeichnissen zu suchen und deren Besitzer zusammen mit dem Verzeichnisnamen in einer NUL-getrennten Liste /sharedauszudrucken .%u%p

  • awk '{c[$1]++; a[$1]=a[$1](a[$1]?"\n ":"")$0} END{for (user in c) if (c[user]>1) print c[user],a[user]}' RS="\0"

    Dies zählt die Anzahl der Verzeichnisse, die jeder Benutzer hat, und druckt einen Bericht für Benutzer mit mehr als einem Verzeichnis aus. Im Detail:

    • c[$1]++erhöht den Zähler für den im ersten Eingabefeld angegebenen Benutzer.

    • a[$1]=a[$1](a[$1]?"\n ":"")$0}speichert den Namen jedes für diesen Benutzer gefundenen Verzeichnisses.

    • END{for (user in c) if (c[user]>1) print c[user],a[user]}druckt den Bericht aus.

    • RS="\0"weist an awk, NUL-getrennte Eingaben zu verwenden. Dadurch wird der Prozess sicher, selbst wenn Verzeichnisnamen Zeilenumbrüche oder andere schwierige Zeichen enthalten.

verwandte Informationen