So erhalten Sie eine Liste aller Eigentümer von Dateien in einem Verzeichnis


14

Ich versuche gerade, mein Quotensystem zu reparieren. Mein Problem ist, dass ich nicht feststellen kann, ob alle Dateien in einem Verzeichnis demselben Benutzer gehören. Wenn möglich gibt es eine Möglichkeit, die verschiedenen Eigentümer von Dateien in einem Verzeichnis (rekursiv) aufzulisten.

z.B get-owners-of DIRNAME


1
Möchten Sie also nur alle Eigentümer oder alle Dateien mit ihren Eigentümern oder alle Dateien anzeigen, deren Eigentümer nicht ein bestimmter Benutzer ist?
Byte Commander

Antworten:


25

Mit können Sie findden Benutzer (Eigentümer) und die Gruppe drucken und anschließend die eindeutigen Kombinationen extrahieren, z

$ sudo find /var -printf '%u:%g\n' | sort -t: -u
_apt:root
avahi-autoipd:avahi-autoipd
clamav:adm
clamav:clamav
colord:colord
daemon:daemon
lightdm:lightdm
lp:lp
man:root
root:adm
root:crontab
root:lp
root:mail
root:mlocate
root:root
root:shadow
root:staff
root:syslog
root:utmp
root:whoopsie
speech-dispatcher:root
statd:nogroup
steeldriver:crontab
steeldriver:lightdm
steeldriver:steeldriver
syslog:adm
systemd-timesync:systemd-timesync
testuser:crontab

1
Um Verzeichnis zu bewerten Inhalt nur (und nicht das Root - Verzeichnis / -e der Suche selbst) hinzufügen -mindepth 1vor -printf. Und ich würde es nicht sudoin das Beispiel aufnehmen, wenn OP nicht in einem Kontext zu funktionieren scheint, in dem es erforderlich ist.
David Foerster

Macht -t:das in diesem Zusammenhang einen Unterschied?
Kasperd

@kasperd guter Punkt - wahrscheinlich nicht (es könnte die Sortierreihenfolge beeinflussen - aber das interessiert uns nicht wirklich)
steeldriver

19
stat -c %U * 

listet die Besitzer aller Dateien auf.

Dies kann sortiert und Duplikate entfernt werden, indem es weitergeleitet wird in sort -u:

stat -c %U * | sort -u

Wie von steeldriver hervorgehoben, ist dies nicht rekursiv. Ich vermisste, dass dies gefragt wurde. Es kann rekursiv gemacht werden, indem globstar aktiviert wird:

shopt -s globstar
stat -c %U **/* | sort -u

Insgesamt ist die Antwort von steeldriver wahrscheinlich besser und sollte hier die akzeptierte Antwort sein :)


Geht das nicht über die Befehlszeilenlänge hinaus, wenn die Suche eine große Anzahl von Dateien enthält? Wenn ja, ist die Antwort von @steeldriver besser.
CSM

@CSM wird es. Aus diesem Grund sage ich, dass die Antwort von Stahlfahrern in vielen Fällen besser ist.
Vidarlo

2
@CSM Ich denke, wenn ARG_MAXes ein Problem ist, das Sie tun könnten printf '%s\0' **/* | xargs -0 stat -c %U(da printfes ein eingebautes ist, sollte es nicht die gleiche Längenbeschränkung haben)
Steeldriver

5

Möglicherweise ist es effizienter, direkt nach Dateien zu suchen, die nicht dem Benutzer gehören ...

find /directory ! -user username -printf "%u %p\n" 

4

DIY-Methode über Python:

#!/usr/bin/env python3
import sys,os,pwd
for f in sys.argv[1:]:
    username = pwd.getpwuid(os.stat(f).st_uid).pw_name
    print( ":".join([f,username])  )

Dies durchläuft alle in der Befehlszeile aufgelisteten Dateinamen, ruft die UID des Dateieigentümers ab und ruft bei Verwendung des pwd- Moduls den Benutzernamen des Eigentümers ab. Danach werden Dateiname und Benutzername für einen schönen Ausdruck zusammengefügt und durch Doppelpunkte getrennt. Funktioniert so:

$ ./get_owners.py /etc/* 
/etc/acpi:root
/etc/adduser.conf:root
/etc/alternatives:root
. . .
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.